فئة OWASP: MASVS-PLATFORM: التفاعل مع النظام الأساسي
نظرة عامة
يمكن لتطبيقات Android ونظام Android استخدام عمليات البث كنظام مراسلة لإشعار التطبيقات الأخرى بالأحداث التي قد تهمّها. عمليات البث الثابتة هي نوع خاص من عمليات البث التي تبقى فيها عناصر Intent المُرسَلة في ذاكرة التخزين المؤقت بعد اكتمال عملية البث. قد يعيد النظام بثّ عناصر Intent الثابتة إلى عمليات تسجيل أجهزة الاستقبال اللاحقة. للأسف، تعاني واجهة برمجة التطبيقات لعمليات البث الثابتة من عدد من أوجه القصور المتعلّقة بالأمان، ولهذا السبب تم إيقافها نهائيًا في Android 5.0 (مستوى واجهة برمجة التطبيقات 21).
يمكن لأيّ مستخدم الوصول إلى عمليات البث الثابتة
لا يمكن حصر عمليات البث الثابتة بأجهزة الاستقبال التي لديها أذونات معيّنة. لذلك، لا تكون مناسبة لبثّ المعلومات الحسّاسة. قد يكون من المغري الاعتقاد أنّ تحديد اسم حزمة التطبيق في Intent الخاص بعملية البث يحدّ من مجموعة BroadcastReceivers:
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
في المثال، لا تتلقّى عناصر Intent إلا أجهزة الاستقبال في حزمة com.example.myapp عند إرسال عملية البث. ومع ذلك، لا يتم تطبيق فلتر اسم الحزمة عند إعادة بثّ Intent من ذاكرة التخزين المؤقت الثابتة. عند تسجيل جهاز استقبال باستخدام طريقة registerReceiver()، تتم إعادة بثّ جميع عناصر Intent في ذاكرة التخزين المؤقت الثابتة التي تتطابق مع الفلتر المحدّد إلى جهاز الاستقبال بغض النظر عن اسم الحزمة التي يقيم فيها جهاز الاستقبال.
يمكن لأيّ مستخدم إرسال عمليات بث ثابتة
لإرسال عمليات بث ثابتة، لا يحتاج التطبيق إلا إلى إذن android.permission.BROADCAST_STICKY، الذي يتم منحه تلقائيًا عند تثبيت التطبيق. لذلك، يمكن للمهاجمين إرسال أيّ Intent إلى أيّ جهاز استقبال، ما قد يؤدي إلى الوصول غير المصرّح به إلى تطبيق آخر. يمكن لأجهزة استقبال عمليات البث حصر المُرسِلين في أولئك الذين لديهم إذن معيّن. ومع ذلك، لن يتمكّن جهاز الاستقبال من تلقّي عمليات البث من ذاكرة التخزين المؤقت الثابتة لأنّها لا تُرسَل في سياق هوية أيّ تطبيق ولا يتم بثّها بأيّ أذونات.
يمكن لأيّ مستخدم تعديل عمليات البث الثابتة
عندما يكون أحد عناصر Intent جزءًا من عملية بث ثابتة، يحلّ هذا العنصر محلّ أيّ نموذج سابق له الإجراء والبيانات والنوع والمعرّف والفئة والفئات نفسها في ذاكرة التخزين المؤقت الثابتة. لذلك، يمكن للمهاجم بسهولة الكتابة فوق البيانات الإضافية في Intent ثابت من تطبيق مشروع، ما قد يؤدي بعد ذلك إلى إعادة بثّه إلى أجهزة استقبال أخرى.
يتم تسليم عمليات البث المُرسَلة باستخدام طريقة sendStickyOrderedBroadcast() إلى جهاز استقبال واحد في كل مرة للسماح لأجهزة الاستقبال ذات الأولوية الأعلى باستهلاك عملية البث قبل تسليمها إلى أجهزة الاستقبال ذات الأولوية الأقل. أثناء تنفيذ كل جهاز استقبال بدوره، يمكنه نشر نتيجة إلى جهاز الاستقبال التالي، مثلاً من خلال استدعاء setResultData()، أو يمكنه إيقاف عملية البث، ما يمنع أجهزة الاستقبال اللاحقة من تلقّي عملية البث. يمكن للمهاجم الذي يمكنه تلقّي عمليات بث ثابتة منظَّمة من تطبيق مشروع إنشاء جهاز استقبال ذي أولوية عالية للتلاعب ببيانات نتيجة عملية البث أو إيقاف عمليات البث تمامًا.
التأثير
يختلف التأثير حسب طريقة استخدام عمليات البث الثابتة والبيانات التي يتم تمريرها إلى أجهزة استقبال عمليات البث. بشكل عام، يمكن أن يؤدي استخدام عمليات البث الثابتة إلى كشف البيانات الحسّاسة والتلاعب بالبيانات والوصول غير المصرّح به لتنفيذ سلوك في تطبيق آخر والحرمان من الخدمة.
الإجراءات المخفّفة
يجب عدم استخدام عمليات البث الثابتة. النمط المقترَح هو استخدام عمليات بث غير ثابتة مع آلية أخرى، مثل قاعدة بيانات محلية، لاسترداد القيمة الحالية متى أردت ذلك.
يمكن للمطوّرين التحكّم في المستخدمين الذين يمكنهم تلقّي عمليات البث غير الثابتة باستخدام الأذونات أو من خلال ضبط اسم حزمة التطبيق على Intent. بالإضافة إلى ذلك، إذا لم يكن من الضروري إرسال عملية بث إلى مكوّنات خارج أحد التطبيقات، استخدِم LiveData، الذي ينفّذ نمط المراقب.
يمكنك الاطّلاع على مزيد من المعلومات حول تأمين عمليات البث في صفحة نظرة عامة على عمليات البث.