OWASP कैटगरी: MASVS-PLATFORM: प्लैटफ़ॉर्म इंटरैक्शन
खास जानकारी
Android ऐप्लिकेशन और Android सिस्टम, ब्रॉडकास्ट का इस्तेमाल मैसेजिंग सिस्टम के तौर पर कर सकते हैं. इससे वे अन्य ऐप्लिकेशन को उन इवेंट के बारे में सूचनाएं भेज सकते हैं जिनमें उनकी दिलचस्पी हो सकती है. स्टिकी ब्रॉडकास्ट, ब्रॉडकास्ट का एक खास टाइप है. ब्रॉडकास्ट पूरा होने के बाद, भेजे गए इंटेंट ऑब्जेक्ट(s) कैश में बने रहते हैं. सिस्टम, बाद में रजिस्टर किए गए रिसीवर को स्टिकी इंटेंट फिर से ब्रॉडकास्ट कर सकता है. दुर्भाग्य से, स्टिकी ब्रॉडकास्ट एपीआई में सुरक्षा से जुड़ी कई कमियां हैं. इसलिए, इसे Android 5.0 (एपीआई लेवल 21) में बंद कर दिया गया था.
स्टिकी ब्रॉडकास्ट को कोई भी ऐक्सेस कर सकता है
स्टिकी ब्रॉडकास्ट को सिर्फ़ उन रिसीवर तक सीमित नहीं किया जा सकता जिनके पास कुछ खास अनुमतियां हों. इसलिए, इनका इस्तेमाल संवेदनशील जानकारी ब्रॉडकास्ट करने के लिए नहीं किया जाना चाहिए. ऐसा लग सकता है कि ब्रॉडकास्ट Intent पर ऐप्लिकेशन पैकेज का नाम तय करने से, BroadcastReceivers का सेट सीमित हो जाता है:
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
उदाहरण के लिए, ब्रॉडकास्ट भेजे जाने पर, com.example.myapp पैकेज में मौजूद रिसीवर को ही इंटेंट मिलता है. हालांकि, स्टिकी कैश से इंटेंट को फिर से ब्रॉडकास्ट करने पर, पैकेज के नाम का फ़िल्टर लागू नहीं होता. registerReceiver() तरीके का इस्तेमाल करके, रिसीवर को रजिस्टर करते समय, स्टिकी कैश में मौजूद वे सभी इंटेंट रिसीवर को फिर से ब्रॉडकास्ट किए जाते हैं जो तय किए गए फ़िल्टर से मेल खाते हैं. भले ही, रिसीवर किसी भी पैकेज के नाम में मौजूद हो.
स्टिकी ब्रॉडकास्ट को कोई भी भेज सकता है
स्टिकी ब्रॉडकास्ट भेजने के लिए, किसी ऐप्लिकेशन को सिर्फ़ android.permission.BROADCAST_STICKY अनुमति की ज़रूरत होती है. यह अनुमति, ऐप्लिकेशन इंस्टॉल होने पर अपने-आप मिल जाती है. इसलिए, हमलावर किसी भी रिसीवर को कोई भी इंटेंट भेज सकते हैं. इससे उन्हें किसी दूसरे ऐप्लिकेशन का अनधिकृत ऐक्सेस मिल सकता है. ब्रॉडकास्ट रिसीवर, सेंडर को सिर्फ़ उन लोगों तक सीमित कर सकते हैं जिनके पास कोई खास अनुमति हो. हालांकि, ऐसा करने पर, रिसीवर को स्टिकी कैश से ब्रॉडकास्ट नहीं मिल सकते. ऐसा इसलिए, क्योंकि उन्हें किसी भी ऐप्लिकेशन की पहचान के संदर्भ में नहीं भेजा जाता और न ही उन्हें किसी अनुमति के साथ ब्रॉडकास्ट किया जाता है.
स्टिकी ब्रॉडकास्ट में कोई भी बदलाव कर सकता है
जब कोई इंटेंट, स्टिकी ब्रॉडकास्ट का हिस्सा होता है, तो वह स्टिकी कैश में मौजूद उस पिछली इंस्टेंस की जगह ले लेता है जिसमें एक ही ऐक्शन, डेटा, टाइप, आइडेंटिफ़ायर, क्लास, और कैटगरी होती हैं. इसलिए, हमलावर किसी मान्य ऐप्लिकेशन से स्टिकी इंटेंट में मौजूद अतिरिक्त डेटा को आसानी से बदल सकता है. इसके बाद, इसे अन्य रिसीवर को फिर से ब्रॉडकास्ट किया जा सकता है.
sendStickyOrderedBroadcast() तरीके का इस्तेमाल करके भेजे गए ब्रॉडकास्ट, एक बार में एक रिसीवर को डिलीवर किए जाते हैं. इससे ज़्यादा प्राथमिकता वाले रिसीवर, कम प्राथमिकता वाले रिसीवर को ब्रॉडकास्ट डिलीवर होने से पहले ही उसे इस्तेमाल कर सकते हैं. हर रिसीवर बारी-बारी से काम करता है. इसलिए, वह अगले रिसीवर को कोई नतीजा दे सकता है. जैसे, setResultData() को कॉल करके या वह ब्रॉडकास्ट को रद्द कर सकता है. इससे बाद के रिसीवर को ब्रॉडकास्ट नहीं मिलता. कोई हमलावर, मान्य ऐप्लिकेशन से स्टिकी ऑर्डर किए गए ब्रॉडकास्ट पा सकता है. वह ब्रॉडकास्ट के नतीजों से छेड़छाड़ करने या ब्रॉडकास्ट को पूरी तरह से रोकने के लिए, ज़्यादा प्राथमिकता वाला रिसीवर बना सकता है.
असर
स्टिकी ब्रॉडकास्ट का इस्तेमाल कैसे किया जाता है और ब्रॉडकास्ट रिसीवर को कौनसा डेटा पास किया जाता है, इस पर असर निर्भर करता है. आम तौर पर, स्टिकी ब्रॉडकास्ट का इस्तेमाल करने से, संवेदनशील डेटा का ऐक्सेस मिल सकता है, डेटा से छेड़छाड़ की जा सकती है, किसी दूसरे ऐप्लिकेशन में अनधिकृत ऐक्सेस मिल सकता है, और सेवा से जुड़ी समस्याएं आ सकती हैं.
कमियां दूर करने के तरीके
स्टिकी ब्रॉडकास्ट का इस्तेमाल नहीं किया जाना चाहिए. हमारा सुझाव है कि स्टिकी ब्रॉडकास्ट के बजाय, नॉन-स्टिकी ब्रॉडकास्ट का इस्तेमाल किया जाए. साथ ही, मौजूदा वैल्यू पाने के लिए, स्थानीय डेटाबेस जैसे किसी अन्य तरीके का इस्तेमाल किया जाए.
डेवलपर, अनुमतियों का इस्तेमाल करके या इंटेंट पर ऐप्लिकेशन पैकेज का नाम सेट करके, यह कंट्रोल कर सकते हैं कि नॉन-स्टिकी ब्रॉडकास्ट कौन पा सकता है. इसके अलावा, अगर किसी ब्रॉडकास्ट को ऐप्लिकेशन के बाहर मौजूद कॉम्पोनेंट को भेजने की ज़रूरत नहीं है, तो LiveData का इस्तेमाल करें. यह ऑब्ज़र्वर पैटर्न को लागू करता है.
ब्रॉडकास्ट को सुरक्षित करने के बारे में ज़्यादा जानकारी के लिए, ब्रॉडकास्ट की खास जानकारी वाला पेज देखें.