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

فئة OWASP: MASVS-PLATFORM: Platform Interaction

نظرة عامة

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

تشير الثغرة الأمنية بشكل عام إلى الحالات التي يتم فيها تصدير أداة استقبال البث بشكل غير مقصود، إما عن طريق ضبط android:exported="true" في AndroidManifest أو عن طريق إنشاء أداة استقبال البث آليًا، ما يجعل أداة الاستقبال عامة تلقائيًا. إذا لم يكن جهاز الاستقبال يحتوي على أي intent filters، تكون القيمة التلقائية هي "false"، ولكن إذا كان جهاز الاستقبال يحتوي على intent filter واحد على الأقل، تكون القيمة التلقائية لـ 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
        // ...
    }
}

تأمين أدوات استقبال البث باستخدام الأذونات

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

الموارد