इंटेंट की पुष्टि बाकी है

OWASP कैटगरी: MASVS-PLATFORM: प्लैटफ़ॉर्म इंटरैक्शन

खास जानकारी

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) और उसके बाद के वर्शन पर, आपको यह बताना होगा कि किन फ़ील्ड में बदलाव किया जा सकता है. इससे, इस तरह की गलती से होने वाली सुरक्षा से जुड़ी समस्याओं को कम किया जा सकता है.

संसाधन


जोखिम: बाकी इंटेंट को फिर से चलाना

PendingIntent को तब तक दोहराया जा सकता है, जब तक FLAG_ONE_SHOT फ़्लैग सेट न हो. रीप्ले अटैक (ऐसी कार्रवाइयां करना जिन्हें दोहराया नहीं जाना चाहिए) से बचने के लिए, FLAG_ONE_SHOT का इस्तेमाल करना ज़रूरी है.

असर

इस जोखिम का असर, इंटेंट को पाने वाले एंडपॉइंट के लागू होने के तरीके के हिसाब से अलग-अलग होता है. कोई नुकसान पहुंचाने वाला ऐप्लिकेशन, FLAG_ONE_SHOT फ़्लैग सेट किए बिना बनाए गए 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);

संसाधन


संसाधन