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

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

एक टास्क वाले एंडपॉइंट

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

संसाधन