هذه المعلومات موجَّهة لمطوِّري البرامج الذين لديهم تطبيقات تحتوي على الثغرة الأمنية Intent Redirection.
تحليل المشكلة
يحتوي تطبيق واحد أو أكثر من تطبيقاتك على الثغرة الأمنية Intent Redirection والتي يمكن أن تسمح للتطبيقات الضارّة بالوصول إلى مكوّنات التطبيقات الخاصة أو ملفاتها. يُرجى مراجعة الخطوات المُفصّلة أدناه لحل المشكلة التي طرأت على تطبيقاتك. وبعد مرور المواعيد النهائية الموضّحة في حسابك على Play Console، سيتم حذف أي تطبيقات تحتوي على ثغرات أمنية لم يتم إصلاحها من Google Play.
مطلوب اتّخاذ إجراء
- سجِّل الدخول إلى حسابك على Play Console، وانتقِل إلى قسم "التنبيهات" لمعرفة التطبيقات المتأثرة والمواعيد النهائية لحل هذه المشاكل.
- حدّث تطبيقاتك المتأثرة باتّباع الخطوات الموضّحة أدناه.
- أرسِل النسخ المُحدّثة من تطبيقاتك المتأثرة.
وعند إعادة الإرسال، سيخضع تطبيقك للمراجعة مرة أخرى. ويمكن أن تستغرق هذه العملية عدة ساعات. إذا اجتاز التطبيق المراجعة وتم نشره بنجاح، لا يلزم اتخاذ أي إجراء آخر. وإذا تعذّر على التطبيق اجتياز المراجعة، لن يتم نشر إصدار التطبيق الجديد وستتلقى إشعارًا عبر البريد الإلكتروني.
تفاصيل إضافية
إنّ استخدام Intent غير موثوق به لإطلاق مكوِّن (عن طريق استدعاء startActivity مثلاً) أو لعرض البيانات (عن طريق استدعاء setResult مثلاً) ينطوي على خطورة وقد يمكّن تطبيقات ضارة من إحداث المشكلتين التاليتين:
- سرقة الملفات الحسّاسة أو بيانات النظام (مثل الرسائل القصيرة SMS) من تطبيقك
- تشغيل المكوّنات الخاصة في تطبيقك باستخدام وسيطات ضارة
من المهم ألّا يستدعي تطبيقك startActivity، أو startService، أو sendBroadcast أو setResult على أهداف Intent غير موثوق بها بدون التحقُّق من هذه الأهداف أو تصحيحها.
وننصحك بمنع ظهور هذه الثغرة الأمنية من خلال اتّباع إحدى الطرق التالية:
الخيار 1: تحويل مكوِّن التطبيق المتأثر إلى مكوّن خاص، أي مكوِّن التطبيق الذي تمت منه إعادة توجيه Intent المستخلَص.
إذا كان مكوِّن التطبيق المتأثر لا يحتاج إلى تلقي عناصر Intent من التطبيقات الأخرى، يمكنك جعل مكوِّن التطبيق خاصًا عن طريق ضبط android:exported="false" في البيان.
الخيار 2: التأكَّد من أنّ مصدر Intent الذي تم استخلاصه موثوق.
يمكنك التأكّد من أنّ النشاط الناشئ يمكن الوثوق به باستخدام طرق مثل getCallingActivity. على سبيل المثال:
// تأكّد مما إذا كان مصدر النشاط الناشئ هو حزمة موثوق بها
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// استخلِص Intent المضمَّن
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// أعِد توجيه Intent المضمَّن
startActivity(forward);
}
ملاحظة:
- يجب التحقّق من أنّ ()getCallingActivity التي تعرِض قيمة غير فارغة تكفي لمنع حدوث الثغرات الأمنية لأنّ التطبيقات الضارّة يمكنها تقديم قيمة فارغة لهذه الدّالة.
- بالنسبة إلى SMS Retriever Auth من "خدمات Google Play"، ستضمن حماية مستقبِل البث مع SEND_PERMISSION أن يكون مصدر Intent هو "خدمات Play".
الخيار 3: التأكَّد من أنّ Intent الذي سيُعاد توجيهه ليس ضارًا.
يجب أن تتحقّق من أنّ Intent المُعاد توجيهه
- لن يتم إرساله إلى أي من مكوِّنات تطبيقك الخاصة.
- لن يتم إرساله إلى مكوِّن تطبيق خارجي. إذا كانت إعادة التوجيه تستهدف تطبيقًا خارجيًا، تأكّد من أنّ Intent لن يمنح إذن عنوان URI لأي موفّر محتوى خاص في تطبيقك أو لبيانات النظام.
يمكن أن تحدّد التطبيقات المكوِّن الذي سيُستخدَم لمعالجة Intent قبل إعادة التوجيه باستخدام طرق مثل resolveActivity. على سبيل المثال:
Intent intent = getIntent();
// استخلِص Intent المضمَّن
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// خُذ اسم المكوِّن
ComponentName name = forward.resolveActivity(getPackageManager());
// تأكّد من أن اسم الحزمة واسم الفئة صحيحان
if (name.getPackageName().equals(“safe_package”) &&
name.getClassName().equals(“safe_class”)) {
// أعِد توجيه Intent المضمَّن
startActivity(forward);
}
يمكن أن تتحقّق التطبيقات مما إذا كان Intent يمنح إذن عنوان URI باستخدام طرق مثل getFlags. على سبيل المثال:
// استخلِص Intent المضمَّن
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// خُذ العلامات
int flags = forward.getFlags();
// تأكّد من أنَّ Intent المضمَّن لا يمنح أذونات URL
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// أعِد توجيه Intent المضمَّن
startActivity(forward);
}
وأيضًا، يمكن للتطبيقات إلغاء أذونات عنوان URI باستخدام removeFlags. على سبيل المثال:
// Intent غير موثوق به
Intent intent = getIntent();
// إلغاء أذونات عنوان URI في Intent غير الموثوق به
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// مرِّر Intent غير الموثوق به
setResult(intent);
فهم التنبيهات وتحديد خيار منع
ترسِل أداة Play Console تنبيهًا عندما يستدعي تطبيقك StartActivity أو startActivityForResult أو StartService أو SendBroadcast أو setResult باستخدام Intent غير موثوق به. ولمعرفة الخيار الأفضل للمنع، يمكنك تتبُّع طلبات الإجراءات وفحصها لمعرفة مصدر Intent غير الموثوق به. على سبيل المثال، بالنسبة إلى الخيار (1)، يمكنك تتبّعه لتحديد المكوِّن الذي تريد تحويله إلى مكوِّن خاص.
تسرّنا مساعدتك
إذا كان لديك أسئلة فنية حول الثغرات الأمنية، يمكنك طرحها على موقع Stack Overflow واستخدام العلامة "android-security". لمزيد من التوضيح بشأن الخطوات المطلوبة لحلّ هذه المشكلة، يمكنك التواصل مع فريق دعم مطوّري البرامج.