فئة OWASP: MASVS-PLATFORM: Platform Interaction (التفاعل مع النظام الأساسي)
نظرة عامة
يمكن أن تسمح أدوات استقبال البث التي تم تنفيذها بشكل غير صحيح للمهاجم بإرسال محتوى ضار لجعل التطبيق المعرض للاختراق ينفِّذ إجراءات غير مخصّصة للمتصلين الخارجيين.
تشير هذه الثغرة الأمنية بشكل عام إلى الحالات التي يتم فيها تصدير ملف "مستقبل البث"
غير مقصود، إما عن طريق ضبط android:exported="true"
فيملف AndroidManifest أو عن طريق إنشاء مستقبل بث آليًا مما يجعله
متاحًا للجميع بشكلٍ تلقائي. إذا كان المُستلِم لا يحتوي على أي فلاتر
للنوايا، تكون القيمة التلقائية هي "false"
، ولكن إذا كان المُستلِم يحتوي على فلاتر
لنوايا واحدة على الأقل، تكون القيمة التلقائية لـ android:exported هي "true"
.
يمكن إساءة استخدام تطبيقات استقبال البث التي تم تصديرها عن قصد بدون التحكّم بشكل صحيح في الوصول إليها إذا لم يكن المطوّر ينوي أن تتصل بها جميع التطبيقات.
التأثير
يمكن للمهاجم إساءة استخدام أدوات استلام البث التي تم تنفيذها بشكل غير آمن للحصول على وصول غير مصرّح به لتنفيذ سلوك في التطبيق لم يكن المطوّر يقصد عرضه لجهات خارجية.
إجراءات التخفيف
تجنُّب المشكلة تمامًا
لحلّ المشكلة بالكامل، اضبط exported
على false
:
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
استخدام المكالمات والمكالمات المُعاد توجيهها
في حال استخدامك لمستقبلي البث لأغراض داخلية في التطبيق (مثل إشعار اكتمال الحدث)، يمكنك إعادة تنظيم الرمز البرمجي لتمرير دالة ردّ اتصال يتم تنشيطها بعد اكتمال الحدث بدلاً من ذلك.
أداة معالجة إكمال الحدث
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
مهمة آمنة
Kotlin
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
Java
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
النشاط الرئيسي
Kotlin
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
Java
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
تأمين أجهزة استقبال البث باستخدام الأذونات
لا تسجِّل إلا أجهزة الاستقبال الديناميكية للبثات المحمية (البثات التي لا يمكن إلا للتطبيقات على مستوى النظام إرسالها) أو التي تملك أذونات على مستوى التوقيع الذاتي.