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 को एक्सपोर्ट नहीं किया जाना चाहिए
- लिंट की जांच: एक्सपोर्ट किए गए रिसीवर को अनुमति की ज़रूरत नहीं है
- लिंट की जांच: एक्सपोर्ट की गई सेवा के लिए अनुमति की ज़रूरत नहीं है