OWASP कैटगरी: MASVS-CODE: कोड की क्वालिटी
खास जानकारी
PendingIntent.getCreator*()
या PendingIntent.getTarget*()
का इस्तेमाल करके यह तय करना कि PendingIntent के सेंडर पर भरोसा करना है या नहीं, शोषण का जोखिम पैदा करता है.
PendingIntent.getCreator*()
या
PendingIntent.getTarget*()
, PendingIntent को बनाने वाले व्यक्ति की जानकारी दिखाता है. यह जानकारी, PendingIntent को भेजने वाले व्यक्ति की जानकारी से हमेशा मेल नहीं खाती. क्रिएटर पर भरोसा किया जा सकता है, लेकिन
भेजने वाले पर कभी भरोसा नहीं करना चाहिए. ऐसा इसलिए, क्योंकि भेजने वाला कोई ऐसा नुकसान पहुंचाने वाला ऐप्लिकेशन हो सकता है
जिसने अलग-अलग तरीकों से, किसी दूसरे ऐप्लिकेशन का PendingIntent हासिल किया हो. उदाहरण के लिए:
NotificationListenerService
से- इस्तेमाल के ऐसे सही उदाहरण जो जोखिम वाले ऐप्लिकेशन का हिस्सा हैं.
PendingIntent.getCreator*()
या PendingIntent.getTarget*()
का सही इस्तेमाल करने का एक उदाहरण यह है कि PendingIntent से शुरू होने वाले ऐप्लिकेशन का आइकॉन दिखाया जाए.
असर
PendingIntent भेजने वाले पर भरोसा करना, सुरक्षा से जुड़ी समस्याओं को जन्म दे सकता है. ऐसा इसलिए, क्योंकि आपने क्रिएटर से क्वेरी की थी और उस पर भरोसा किया था. अगर कोई ऐप्लिकेशन, PendingIntent के सेंडर पर भरोसा करता है, तो वह अपने क्रिएटर के आधार पर, पुष्टि करने या अनुमति देने का लॉजिक शेयर करता है. ऐसे में, जब भी PendingIntent का सेंडर कोई नुकसान पहुंचाने वाला ऐप्लिकेशन होता है, तो इससे पुष्टि करने की प्रोसेस को बायपास किया जा सकता है. साथ ही, अमान्य और अविश्वसनीय इनपुट के आधार पर रिमोट कोड को एक्ज़ीक्यूट भी किया जा सकता है. यह सब, जोखिम वाले ऐप्लिकेशन के कोड को लागू करने के तरीके पर निर्भर करता है.
जोखिम कम करने के तरीके
मैसेज भेजने वाले और क्रिएटर के बीच अंतर करना
PendingIntent पाने पर, किसी भी तरह के पुष्टि करने या अनुमति देने के लॉजिक को, PendingIntent के क्रिएटर के बारे में अनुमानों पर आधारित नहीं होना चाहिए. क्रिएटर की पहचान PendingIntent.getCreator*()
या PendingIntent.getTarget*()
का इस्तेमाल करके की जाती है.
कॉल करने वालों की पुष्टि करने के लिए, अन्य तरीकों का इस्तेमाल करना
अगर आपको कॉल करने वाले की पुष्टि करनी है, तो PendingIntent का इस्तेमाल करने के बजाय, आपको Service या ContentProvider का इस्तेमाल करना चाहिए. ये दोनों, इनकमिंग आईपीसी को डिसपैच करने के कॉन्टेक्स्ट में होने पर, Binder.getCallingUid() की मदद से, कॉल करने वाले का यूआईडी फ़ेच करने की अनुमति देते हैं. यूआईडी के बारे में बाद में PackageManager.getPackagesForUid() का इस्तेमाल करके क्वेरी की जा सकती है.
एपीआई लेवल 34 से उपलब्ध एक और तरीका यह है कि अगर भेजने वाले ने BroadcastOptions.isShareIdentityEnabled() का इस्तेमाल करके ब्रॉडकास्ट के दौरान पहचान शेयर करने के लिए ऑप्ट-इन किया है, तो BroadcastReceiver.getSentFromUid() या BroadcastReceiver.getSentFromPackage() का इस्तेमाल करें.
आपको हमेशा यह जांच करनी चाहिए कि कॉलिंग पैकेज में उम्मीद के मुताबिक हस्ताक्षर है या नहीं. ऐसा इसलिए, क्योंकि साइडलोड किए गए पैकेज के नाम, Play Store के पैकेज के नामों से मेल खा सकते हैं.