فئة 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
// ...
}
}
تأمين أدوات استقبال البث باستخدام الأذونات
لا تسجِّل إلا أدوات استقبال ديناميكية لعمليات البث المحمي (عمليات البث التي يمكن للتطبيقات على مستوى النظام فقط إرسالها) أو أذونات مستوى التوقيع المعلَن ذاتيًا.