فئة OWASP: MASVS-PLATFORM: Platform Interaction (التفاعل مع النظام الأساسي)
نظرة عامة
إذن Android هو معرّف سلسلة يتم الإعلان عنه في ملف بيان التطبيق لطلب الوصول إلى بيانات أو إجراءات محظورة، ويتم فرضه أثناء التشغيل من خلال إطار عمل Android.
تشير مستويات أذونات Android إلى الخطر المحتمل المرتبط بال الإذن:
- عادي: أذونات منخفضة الخطورة، يتم منحها تلقائيًا في وقت التثبيت
- خطيرة: أذونات عالية الخطورة يمكن أن تسمح بالوصول إلى data العميل الحسّاسة، وتتطلّب موافقة صريحة من المستخدم في وقت التشغيل
- التوقيع: لا يتم منحه إلا للتطبيقات الموقَّعة باستخدام الشهادة نفسها المستخدَمة في التطبيق الذي يعلن عن الإذن، ويتم استخدامه عادةً لتطبيقات النظام أو التفاعلات بين التطبيقات التي يطوّرها المطوّر نفسه.
تحدث نقاط الضعف المرتبطة بعناصر التحكّم في الوصول المستندة إلى الأذونات عندما يستوفي أحد مكونات التطبيق (مثل النشاط أو المستلِم أو موفِّر المحتوى أو الخدمة) جميع المعايير التالية:
- المكوّن غير مرتبط بأي
android:permission
فيManifest
- يؤدي المكوّن مهمة حسّاسة يتوفّر لها إذن سبق أن وافق عليه المستخدم.
- يتم تصدير المكوّن.
- لا يُجري المكوّن أي عمليات فحص يدوي (على مستوى البيان أو الرمز) للسماح.
وفي هذه الحالة، يمكن للتطبيق الضار تنفيذ إجراءات حسّاسة من خلال إساءة استخدام امتيازات المكوّن المعرض للاختراق، ومنح التطبيق الضار إذنًا بالوصول إلى امتيازات التطبيق المعرض للاختراق.
التأثير
يمكن استخدام تصدير المكوّنات المعرّضة للاختراق للوصول إلى موارد حساسة أو لتنفيذ إجراءات حسّاسة. يعتمد تأثير هذا السلوك غير المرغوب فيه على سياق المكوّن المعرض للاختراق وامتيازاته.
إجراءات التخفيف
طلب أذونات للمهام الحسّاسة
عند تصدير مكوّن يتضمّن أذونات حسّاسة، اطلب تلك الأذونات نفسها لأي طلب وارد. يتضمّن "محرّر بيئة تطوير البرامج (IDE) لنظام التشغيل Android Studio" عمليات تحقّق من الأخطاء في المستقبلين والخدمات لرصد هذه الثغرة الأمنية واقتراح طلب الأذونات المناسبة.
يمكن للمطوّرين طلب أذونات للطلبات الواردة إما من خلال الإفصاح عنها في ملف 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
.
Xml
<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 من واجهة برمجة التطبيقات) تم ضبط القيمة التلقائية التي تم تصديرها على "false"
- فحص الأخطاء: يجب عدم تصدير فئة PreferenceActivity التي تم تصديرها
- فحص الأخطاء: لا يتطلب المستلِم الذي تم تصديره إذنًا
- فحص الأخطاء: لا تتطلّب الخدمة التي تم تصديرها إذنًا