OWASP कैटगरी: MASVS-PLATFORM: Platform Interaction
खास जानकारी
PendingIntent, सिस्टम के ज़रिए मैनेज किए जाने वाले टोकन का रेफ़रंस होता है. ऐप्लिकेशन A, ऐप्लिकेशन B को PendingIntent पास कर सकता है, ताकि ऐप्लिकेशन B, ऐप्लिकेशन A की ओर से पहले से तय की गई कार्रवाइयां कर सके. इससे कोई फ़र्क़ नहीं पड़ता कि ऐप्लिकेशन A अब भी चालू है या नहीं.
रिस्क: म्यूटबल पेंडिंग इंटेंट
PendingIntent को बदला जा सकता है. इसका मतलब है कि ऐक्शन के बारे में बताने वाले इनर इंटेंट को ऐप्लिकेशन B अपडेट कर सकता है. इसके लिए, उसे fillIn() दस्तावेज़ में बताया गया लॉजिक इस्तेमाल करना होगा. दूसरे शब्दों में कहें, तो नुकसान पहुंचाने वाला ऐप्लिकेशन, PendingIntent के उन फ़ील्ड में बदलाव कर सकता है जिनमें कोई वैल्यू नहीं डाली गई है. इससे, वह ऐप्लिकेशन के उन कॉम्पोनेंट को ऐक्सेस कर सकता है जिन्हें एक्सपोर्ट नहीं किया गया है.
असर
इस जोखिम का असर, ऐप्लिकेशन की उस सुविधा को लागू करने के तरीके पर निर्भर करता है जिसे एक्सपोर्ट नहीं किया गया है.
जोखिम कम करने के तरीके
सामान्य
पक्का करें कि कार्रवाई, कॉम्पोनेंट, और पैकेज सेट किए गए हों, ताकि सबसे गंभीर जोखिमों से बचा जा सके:
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
IMMUTABLE फ़्लैग
अगर आपका ऐप्लिकेशन, Android 6 (एपीआई लेवल 23) या उसके बाद के वर्शन को टारगेट करता है, तो म्यूटेबिलिटी की जानकारी दें. उदाहरण के लिए, FLAG_IMMUTABLE का इस्तेमाल करके, खाली फ़ील्ड को नुकसान पहुंचाने वाले ऐप्लिकेशन से भरने से रोका जा सकता है:
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
Android 11 (एपीआई लेवल 30) और इसके बाद के वर्शन पर, आपको यह बताना होगा कि किन फ़ील्ड को बदला जा सकता है. इससे इस तरह की अनजाने में होने वाली कमज़ोरियों को कम किया जा सकता है.
संसाधन
जोखिम: लंबित इंटेंट को फिर से चलाना
FLAG_ONE_SHOT फ़्लैग सेट न होने पर, PendingIntent को फिर से चलाया जा सकता है. रीप्ले अटैक (ऐसी कार्रवाइयां करना जिन्हें दोहराया नहीं जाना चाहिए) से बचने के लिए, FLAG_ONE_SHOT का इस्तेमाल करना ज़रूरी है.
असर
इस जोखिम का असर, इंटेंट को पाने वाले ऐप्लिकेशन के लागू करने के तरीके के हिसाब से अलग-अलग होता है. FLAG_ONE_SHOT फ़्लैग सेट किए बिना बनाए गए PendingIntent का गलत इस्तेमाल करने वाला कोई दुर्भावनापूर्ण ऐप्लिकेशन, इंटेंट को कैप्चर करके उसका फिर से इस्तेमाल कर सकता है. इससे उन कार्रवाइयों को दोहराया जा सकता है जिन्हें सिर्फ़ एक बार किया जाना चाहिए.
जोखिम कम करने के तरीके
जिन PendingIntent को एक से ज़्यादा बार ट्रिगर नहीं किया जाना चाहिए उन्हें FLAG_ONE_SHOT फ़्लैग का इस्तेमाल करना चाहिए, ताकि रीप्ले अटैक से बचा जा सके.
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
संसाधन
संसाधन
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक का टेक्स्ट दिखता है
- इंटेंट रीडायरेक्शन