فئة OWASP: MASVS-PLATFORM: Platform Interaction (التفاعل مع النظام الأساسي)
نظرة عامة
إذن Android هو معرّف سلسلة يتم الإعلان عنه في ملف بيان التطبيق لطلب الوصول إلى بيانات أو إجراءات محظورة، ويتم فرضه أثناء التشغيل من خلال إطار عمل Android.
تشير مستويات أذونات Android إلى الخطر المحتمل المرتبط بال الإذن:
- عادي: أذونات منخفضة الخطورة، يتم منحها تلقائيًا في وقت التثبيت
- خطيرة: أذونات عالية الخطورة يمكن أن تسمح بالوصول إلى data العميل الحسّاسة، وتتطلّب موافقة صريحة من المستخدم في وقت التشغيل
- التوقيع: يتم منحه فقط للتطبيقات الموقعة باستخدام الشهادة نفسها التي يستخدمها التطبيق الذي يُعلِن عن الإذن، ويتم استخدامه عادةً مع تطبيقات النظام أو التفاعلات بين التطبيقات من مطوّر البرامج نفسه
تحدث نقاط الضعف المرتبطة بعناصر التحكّم في الوصول المستندة إلى الأذونات عندما يستوفي أحد مكونات التطبيق (مثل النشاط أو المستلِم أو موفِّر المحتوى أو الخدمة) جميع المعايير التالية:
- المكوِّن غير مرتبط بأي
android:permission
فيManifest
. - يؤدي المكوّن مهمة حسّاسة يتوفّر لها إذن سبق أن وافق عليه المستخدم.
- يتم تصدير المكوِّن.
- لا يُجري المكوّن أي عمليات فحص يدوي (على مستوى البيان أو الرمز) للسماح.
وفي هذه الحالة، يمكن للتطبيق الضار تنفيذ إجراءات حسّاسة من خلال إساءة استخدام امتيازات المكوّن المعرض للاختراق، ومنح التطبيق الضار إذنًا بالوصول إلى امتيازات التطبيق المعرض للاختراق.
التأثير
يمكن استخدام تصدير المكوّنات المعرّضة للاختراق للوصول إلى موارد حساسة أو لتنفيذ إجراءات حسّاسة. يعتمد تأثير هذا السلوك غير المرغوب فيه على سياق العنصر المعرّض للهجوم وامتيازاته.
إجراءات التخفيف
طلب أذونات للمهام الحسّاسة
عند تصدير مكوّن يتضمّن أذونات حسّاسة، اطلب تلك الأذونات نفسها لأي طلب وارد. تتوفر في بيئة تطوير البرامج (IDE) في "استوديو Android" عمليات فحص Lint للمستلمين والخدمات لاكتشاف هذه الثغرة الأمنية واقتراح طلب الأذونات المناسبة.
يمكن للمطوّرين طلب أذونات بالطلبات الواردة إما من خلال الإفصاح عنها في ملف Manifest
أو على مستوى الرمز البرمجي عند تنفيذ الخدمة كما في الأمثلة التالية.
Xml
<manifest ...>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application ...>
<service android:name=".MyExportService"
android:exported="true"
android:permission="android.permission.READ_CONTACTS" />
</application>
</manifest>
Kotlin
class MyExportService : Service() {
private val binder = MyExportBinder()
override fun onBind(intent: Intent): IBinder? {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
// Permission is enforced, proceed with export logic
return binder
}
// Inner class for your Binder implementation
private inner class MyExportBinder : Binder() {
// Permission is enforced, proceed with export logic
}
}
Java
public class MyExportService extends Service {
@Override
public IBinder onBind(Intent intent) {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");
return binder;
}
// Inner class for your Binder implementation
private class MyExportBinder extends Binder {
// Permission is enforced, proceed with export logic
}
}
لا تصدِّر المكوّن.
تجنَّب تصدير المكوّنات التي يمكنها الوصول إلى موارد حسّاسة ما لم يكن ذلك ضروريًا
تمامًا. يمكنك إجراء ذلك من خلال ضبط android:exported
في ملف
Manifest
على false
لمكوّنك. من المستوى 31 لواجهة برمجة التطبيقات وما بعده، يتم ضبط هذه السمة على false
تلقائيًا.
حجم كبير جدًا
<activity
android:name=".MyActivity"
android:exported="false"/>
تطبيق الأذونات المستندة إلى التوقيع
عند مشاركة البيانات بين تطبيقَين تتحكم فيهما أو تملكهما، استخدِم أذونات المستندة إلى التوقيع. لا تتطلّب هذه الأذونات تأكيد المستخدم، وبدلاً من ذلك، تتم اتّباع الخطوات التالية: التحقّق من أنّ التطبيقات التي تصل إلى البيانات موقَّعة باستخدام مفتاح التوقيع نفسه يوفّر هذا الإعداد تجربة مستخدم أكثر سلاسة وأمانًا. في حال الإفصاح عن أذونات مخصّصة، يُرجى مراعاة إرشادات الأمان المقابلة.
Xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<permission android:name="my_custom_permission_name"
android:protectionLevel="signature" />
نقاط نهاية المهام الفردية
نفِّذ تطبيقك باتّباع مبدأ التصميم فصل المخاوف. يجب أن تنفِّذ كل نقطة نهاية مجموعة صغيرة فقط من المهام المحدَّدة بامتيازات معيّنة. تسمح هذه الممارسة الجيدة للتصميم للمطوّر أيضًا بتطبيق أذونات دقيقة لكل نقطة نهاية. على سبيل المثال، تجنب إنشاء نقطة نهاية واحدة تخدم كلاً من التقويم وجهات الاتصال.
المراجع
- Android Access to app protected components من مدونة Oversecured
- أفضل الممارسات لموفّري المحتوى
- أذونات وقت التشغيل (الخطيرة)
- مبدأ تصميم "فصل المخاوف"
- مستندات أذونات Android
- نصائح حول أمان تطبيقات Android التي تتلقّى البث
- نصائح حول أمان خدمات Android
- ضبط الإعدادات التلقائية التي تم تصديرها لنظام Android 12 (واجهة برمجة التطبيقات 31) على "خطأ"
- فحص الأخطاء: يجب عدم تصدير فئة PreferenceActivity التي تم تصديرها
- فحص الأخطاء: لا يتطلب المستلِم الذي تم تصديره إذنًا
- فحص الأخطاء: لا تتطلّب الخدمة التي تم تصديرها إذنًا