فئة OWASP: MASVS-PLATFORM: التفاعل مع النظام الأساسي
نظرة عامة
PendingIntent هو مرجع إلى رمز مميز يحتفظ به النظام. يمكن للتطبيق "أ" تمرير PendingIntent إلى التطبيق "ب" للسماح للتطبيق "ب" بتنفيذ إجراءات محدّدة مسبقًا نيابةً عن التطبيق "أ"، بغض النظر عمّا إذا كان التطبيق "أ" لا يزال نشطًا.
المخاطرة: PendingIntent قابلة للتغيير
يمكن أن يكون رمز PendingIntent قابلاً للتغيير، ما يعني أنّه يمكن لتطبيق B تعديل الغرض الداخلي الذي يحدّد الإجراء وفقًا للمنطق الموضّح في مستندات fillIn(). بعبارة أخرى، يمكن لتطبيق ضار تعديل الحقول غير المملوءة في PendingIntent والسماح بالوصول إلى المكوّنات غير المُصدَّرة للتطبيق المعرَّض للخطر.
التأثير
يختلف تأثير هذه الثغرة الأمنية حسب طريقة تنفيذ الوظيفة المستهدَفة غير المُصدَّرة في التطبيق.
إجراءات التخفيف
بنود عامة
تأكَّد من ضبط الإجراء والمكوّن والحزمة لتجنُّب أسوأ الثغرات الأمنية:
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
العلامة IMMUTABLE
إذا كان تطبيقك يستهدف الإصدار 6 من نظام التشغيل Android (المستوى 23 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، عليك تحديد قابلية التغيّر. على سبيل المثال، يمكن إجراء ذلك باستخدام FLAG_IMMUTABLE لمنع تطبيق ضار من ملء الحقول غير المملوءة:
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
في الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأحدث، عليك تحديد الحقول التي تريد إتاحة تغييرها، ما يقلّل من الثغرات الأمنية العرضية من هذا النوع.
الموارد
المخاطرة: إعادة تشغيل PendingIntent
يمكن إعادة تشغيل PendingIntent ما لم يتم ضبط العلامة FLAG_ONE_SHOT. من المهم استخدام FLAG_ONE_SHOT لتجنُّب هجمات إعادة الإرسال (تنفيذ إجراءات لا يجب أن تكون قابلة للتكرار).
التأثير
يختلف تأثير هذه الثغرة الأمنية حسب طريقة تنفيذ الطرف المستلِم للغرض. يمكن لتطبيق ضار يستغلّ PendingIntent تم إنشاؤه بدون ضبط العلامة FLAG_ONE_SHOT أن يرصد الغرض ويعيد استخدامه لتكرار الإجراءات التي لا يمكن تنفيذها إلا مرة واحدة.
إجراءات التخفيف
يجب استخدام العلامة FLAG_ONE_SHOT مع PendingIntent التي لا يُراد تشغيلها عدة مرات لتجنُّب هجمات إعادة التشغيل.
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
الموارد
الموارد
مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة.
- إعادة التوجيه المستندة إلى النية