التحكم في الوصول المستند إلى الإذن إلى المكوّنات التي تم تصديرها

فئة 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" />

نقاط نهاية المهام الفردية

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

المراجع