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

فئة OWASP: MASVS-PLATFORM: Platform Interaction

نظرة عامة

إذن Android هو معرّف سلسلة يتم الإعلان عنه في ملف البيان الخاص بالتطبيق لطلب الوصول إلى بيانات أو إجراءات محظورة، ويتم فرضه في وقت التشغيل من خلال إطار عمل Android.

تشير مستويات أذونات Android إلى المخاطر المحتملة المرتبطة بالإذن، وهي:

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

تحدث الثغرات الأمنية المرتبطة بعناصر التحكّم في الوصول المستندة إلى الأذونات عندما يستوفي أحد مكونات التطبيق (مثل النشاط أو المستلِم أو موفّر المحتوى أو الخدمة) جميع المعايير التالية:

  • لا يرتبط المكوّن بأي 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 تلقائيًا.

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" />

نقاط نهاية ذات مهمة واحدة

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

الموارد