عمليات بث ثابتة

فئة OWASP: MASVS-PLATFORM: Platform Interaction (التفاعل مع النظام الأساسي)

نظرة عامة

يمكن لتطبيقات Android ونظام Android استخدام عمليات البث كنظام مراسلة لإشعار التطبيقات الأخرى بالأحداث التي قد تهمّها. البثّات الثابتة هي نوع خاص من البثّات التي تبقى عناصر النية المُرسَلة فيها في ذاكرة التخزين المؤقت بعد اكتمال البثّ. قد يعيد النظام بثّ النوايا الثابتة في عمليات التسجيل اللاحقة لأجهزة الاستقبال. تواجه واجهة برمجة التطبيقات لميزة "البثّات الثابتة" عددًا من العيوب المتعلّقة بالأمان، لذلك تم إيقافها نهائيًا في الإصدار 5.0 من نظام التشغيل Android (المستوى 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);

في المثال، لا يتلقّى البث إلا المستلِمون في حزمة com.example.myapp عند إرسال البث. ومع ذلك، لا يتم تطبيق فلتر اسم الحزمة عند إعادة بث الطلب من ذاكرة التخزين المؤقت الثابتة. عند تسجيل جهاز استقبال باستخدام طريقة registerReceiver()، تتم إعادة بث جميع النوايا في ذاكرة التخزين المؤقت الثابتة التي تتطابق مع الفلتر المحدّد إلى جهاز الاستقبال بغض النظر عن اسم الحزمة التي يتوفّر فيها جهاز الاستقبال.

يمكن لأي مستخدم إرسال أحداث بث ثابتة.

لإرسال أحداث البث الثابتة، لا يحتاج التطبيق سوى إذن android.permission.BROADCAST_STICKY الذي يتم منحه تلقائيًا عند تثبيت التطبيق. وبالتالي، يمكن للمهاجمين إرسال أي نية إلى أي جهاز استقبال، ما قد يؤدي إلى الحصول على إذن وصول غير مصرّح به إلى تطبيق آخر. ويمكن لأجهزة استقبال البث حصر المُرسِلين بأولئك الذين لديهم إذن معيّن. ومع ذلك، لا يمكن للمستلِم تلقّي عمليات البث من ذاكرة التخزين المؤقت الثابتة لأنّه لا يتم إرسالها في سياق هوية أي تطبيق ولا يتم بثها باستخدام أي أذونات.

يمكن لأي مستخدم تعديل البث المباشر المُلصق.

عندما يكون الإجراء جزءًا من بث ثابت، يحلّ هذا الإجراء محلّ أي مثيل سابق يتضمّن الإجراء والبيانات والنوع والمعرّف والفئة والفئات نفسها في ذاكرة التخزين المؤقت الثابتة. وبالتالي، يمكن للمهاجم بسهولة استبدال البيانات الإضافية في طلب ثابت من تطبيق مشروع، ما قد يؤدي إلى إعادة بثها إلى أجهزة استقبال أخرى.

يتم تسليم أحداث البث المُرسَلة باستخدام طريقة sendStickyOrderedBroadcast() إلى جهاز استقبال واحد في المرة الواحدة للسماح لأجهزة الاستقبال ذات الأولوية الأعلى باستهلاك البث قبل تسليمه إلى أجهزة الاستقبال ذات الأولوية الأقل. أثناء تنفيذ كل جهاز استقبال بدوره، يمكنه نشر نتيجة إلى جهاز الاستقبال التالي، مثلاً من خلال استدعاء setResultData()، أو يمكنه إيقاف البث، ما يمنع أجهزة الاستقبال اللاحقة من تلقّي البث. يمكن للمهاجم الذي يمكنه تلقّي عمليات البث المستمرة من تطبيق شرعي إنشاء جهاز استقبال ذو أولوية عالية للتلاعب ببيانات نتائج البث أو إيقاف عمليات البث تمامًا.

التأثير

يختلف التأثير حسب طريقة استخدام عمليات البث الثابتة والبيانات التي يتم تمريرها إلى أجهزة استقبال البث. بشكل عام، يمكن أن يؤدي استخدام عمليات البث الثابتة إلى تعريض البيانات الحسّاسة للخطر والتلاعب بالبيانات والوصول غير المصرّح به لتنفيذ السلوك في تطبيق آخر ورفض الخدمة.

إجراءات التخفيف

يجب عدم استخدام البثّات الثابتة. النمط المقترَح هو استخدام عمليات البث غير الثابتة مع آلية أخرى، مثل قاعدة بيانات محلية، لاسترداد القيمة الحالية متى شئت.

يمكن للمطوّرين التحكّم في المستخدمين الذين يمكنهم تلقّي عمليات البث غير الثابتة باستخدام الأذونات أو من خلال ضبط اسم حِزمة التطبيق في النية. بالإضافة إلى ذلك، إذا لم يكن من الضروري إرسال بث إلى مكوّنات خارج التطبيق، استخدِم LiveData الذي ينفِّذ نمط المراقِب.

يمكنك الاطّلاع على مزيد من المعلومات حول تأمين البث في صفحة نظرة عامة على البث.