أجهزة استقبال بث غير آمنة

فئة 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
        // ...
    }
}

تأمين أجهزة استقبال البث باستخدام الأذونات

لا تسجِّل إلا أجهزة الاستقبال الديناميكية للبثات المحمية (البثات التي لا يمكن إلا للتطبيقات على مستوى النظام إرسالها) أو التي تملك أذونات على مستوى التوقيع الذاتي.

المراجع