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" />
एक टास्क वाले एंडपॉइंट
समस्याओं को अलग-अलग करना डिज़ाइन के सिद्धांत का पालन करके, अपना ऐप्लिकेशन लागू करें. हर एंडपॉइंट को खास अधिकारों वाले कुछ चुनिंदा टास्क ही करने चाहिए. डिज़ाइन के इस अच्छे तरीके से, डेवलपर को हर एंडपॉइंट के लिए ज़्यादा जानकारी वाली अनुमतियां लागू करने की अनुमति भी मिलती है. उदाहरण के लिए, एक ऐसा एंडपॉइंट बनाने से बचें जो कैलेंडर और संपर्क, दोनों के लिए काम करता हो.
संसाधन
- Oversecured ब्लॉग से, ऐप्लिकेशन के सुरक्षित कॉम्पोनेंट का Android ऐक्सेस
- कॉन्टेंट उपलब्ध कराने वाले के लिए सबसे सही तरीके
- रनटाइम (खतरनाक) अनुमतियां
- अलग-अलग बातों को अलग-अलग रखना
- Android की अनुमतियों से जुड़ा दस्तावेज़
- Android ब्रॉडकास्ट रिसीवर की सुरक्षा से जुड़ी सलाह
- Android की सेवाओं की सुरक्षा से जुड़ी सलाह
- Android 12 (एपीआई 31) के लिए, एक्सपोर्ट की गई वैल्यू डिफ़ॉल्ट रूप से "गलत" पर सेट होती है
- लिंट की जांच: एक्सपोर्ट की गई PreferenceActivity को एक्सपोर्ट नहीं किया जाना चाहिए
- लिंट चेक: एक्सपोर्ट किए गए रिसीवर के लिए अनुमति की ज़रूरत नहीं है
- Lint Check: एक्सपोर्ट की गई सेवा के लिए अनुमति की ज़रूरत नहीं है