एक्सपोर्ट किए गए कॉम्पोनेंट के लिए, अनुमति के हिसाब से ऐक्सेस कंट्रोल करना

OWASP कैटगरी: MASVS-PLATFORM: प्लैटफ़ॉर्म इंटरैक्शन

खास जानकारी

Android की अनुमति, एक स्ट्रिंग आइडेंटिफ़ायर होती है. इसे ऐप्लिकेशन के मेनिफ़ेस्ट में, पाबंदी वाले डेटा या कार्रवाइयों को ऐक्सेस करने का अनुरोध करने के लिए तय किया जाता है. Android फ़्रेमवर्क, रनटाइम के दौरान इसे लागू करता है.

Android की अनुमति के लेवल से, अनुमति से जुड़े संभावित जोखिम का पता चलता है:

  • सामान्य: कम जोखिम वाली अनुमतियां. ये अनुमतियां, ऐप्लिकेशन इंस्टॉल करते समय अपने-आप मिल जाती हैं
  • खतरनाक: ज़्यादा जोखिम वाली अनुमतियां. इनकी मदद से, उपयोगकर्ता के संवेदनशील डेटा को ऐक्सेस किया जा सकता है. इसके लिए, रनटाइम के दौरान उपयोगकर्ता की साफ़ तौर पर मंज़ूरी लेना ज़रूरी है
  • सिग्नेचर: ये अनुमतियां सिर्फ़ उन ऐप्लिकेशन को मिलती हैं जिन्हें अनुमति तय करने वाले ऐप्लिकेशन के सर्टिफ़िकेट से ही साइन किया गया हो. आम तौर पर, इनका इस्तेमाल सिस्टम ऐप्लिकेशन या एक ही डेवलपर के ऐप्लिकेशन के बीच इंटरैक्शन के लिए किया जाता है

अनुमति के आधार पर ऐक्सेस कंट्रोल से जुड़ी समस्याएं तब होती हैं, जब किसी ऐप्लिकेशन का कॉम्पोनेंट (जैसे कि गतिविधि, रिसीवर, कॉन्टेंट प्रोवाइडर, या सेवा) इन सभी शर्तों को पूरा करता है:

  • कॉम्पोनेंट, Manifest में किसी भी android:permission से जुड़ा नहीं है;
  • कॉम्पोनेंट, कोई संवेदनशील टास्क करता है. इसके लिए, ऐसी अनुमति मौजूद है जिसे उपयोगकर्ता ने पहले ही मंज़ूरी दी है;
  • कॉम्पोनेंट एक्सपोर्ट किया गया है;
  • कॉम्पोनेंट, अनुमति की मैन्युअल (मेनिफ़ेस्ट या कोड-लेवल) जांच नहीं करता है;

ऐसा होने पर, कोई नुकसान पहुंचाने वाला ऐप्लिकेशन, संवेदनशील कार्रवाइयां कर सकता है. इसके लिए, वह गड़बड़ी वाले कॉम्पोनेंट के विशेषाधिकारों का गलत इस्तेमाल करता है. साथ ही, गड़बड़ी वाले ऐप्लिकेशन के विशेषाधिकारों को नुकसान पहुंचाने वाले ऐप्लिकेशन को प्रॉक्सी करता है.

असर

गड़बड़ी वाले कॉम्पोनेंट को एक्सपोर्ट करके, संवेदनशील संसाधनों को ऐक्सेस किया जा सकता है या संवेदनशील कार्रवाइयां की जा सकती हैं. इस अनचाहे व्यवहार का असर, गड़बड़ी वाले कॉम्पोनेंट के कॉन्टेक्स्ट और उसके विशेषाधिकारों पर निर्भर करता है.

कम करने के तरीके

संवेदनशील टास्क के लिए अनुमतियां ज़रूरी करना

संवेदनशील अनुमतियों वाले कॉम्पोनेंट को एक्सपोर्ट करते समय, आने वाले हर अनुरोध के लिए वही अनुमतियां ज़रूरी करें. Android Studio IDE में, रिसीवर और सेवाओं के लिए लिंट की जांच की जाती है. इससे इस गड़बड़ी का पता चलता है. साथ ही, सही अनुमतियां ज़रूरी करने का सुझाव दिया जाता है.

डेवलपर, आने वाले अनुरोधों के लिए अनुमतियां ज़रूरी कर सकते हैं. इसके लिए, वे Manifest फ़ाइल में अनुमतियों की घोषणा कर सकते हैं या सेवा लागू करते समय कोड-लेवल पर अनुमतियां तय कर सकते हैं. इसके उदाहरण यहां दिए गए हैं.

एक्सएमएल

<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

    }
}

कॉम्पोनेंट को एक्सपोर्ट न करें

संवेदनशील संसाधनों को ऐक्सेस करने वाले कॉम्पोनेंट को एक्सपोर्ट करने से बचें. ऐसा सिर्फ़ तब करें, जब यह ज़रूरी हो. इसके लिए, अपने कॉम्पोनेंट के लिए Manifest फ़ाइल में android:exported को false पर सेट करें. एपीआई लेवल 31 और इसके बाद के वर्शन में, यह एट्रिब्यूट डिफ़ॉल्ट रूप से false पर सेट होता है.

एक्सएमएल

<activity
    android:name=".MyActivity"
    android:exported="false"/>

सिग्नेचर के आधार पर अनुमतियां लागू करना

अपने कंट्रोल या मालिकाना हक वाले दो ऐप्लिकेशन के बीच डेटा शेयर करते समय, सिग्नेचर के आधार पर अनुमतियों का इस्तेमाल करें. इन अनुमतियों के लिए, उपयोगकर्ता की पुष्टि की ज़रूरत नहीं होती. इसके बजाय, यह जांच की जाती है कि डेटा को ऐक्सेस करने वाले ऐप्लिकेशन को, उसी साइनिंग पासकोड का इस्तेमाल करके साइन किया गया है या नहीं. इस सेटअप से, लोगों को बेहतर और सुरक्षित अनुभव मिलता है. अगर आपने कस्टम अनुमतियां तय की हैं, तो सुरक्षा से जुड़े दिशा-निर्देशों को ध्यान में रखें.

एक्सएमएल

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />

सिंगल-टास्क एंडपॉइंट

अपने ऐप्लिकेशन को, गौर करने लायक अलग-अलग बातों के डिज़ाइन सिद्धांत के मुताबिक लागू करें. हर एंडपॉइंट को, खास विशेषाधिकारों के साथ, सिर्फ़ कुछ खास टास्क करने चाहिए. इस बेहतर डिज़ाइन की मदद से, डेवलपर हर एंडपॉइंट के लिए, अलग-अलग अनुमतियां लागू कर सकता है. उदाहरण के लिए, ऐसा सिंगल एंडपॉइंट न बनाएं जो कैलेंडर और संपर्कों, दोनों के लिए काम करे.

संसाधन