इंप्लिसिट इंटेंट हाइजैकिंग

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

खास जानकारी

जब कोई ऐप्लिकेशन, इंटेंट को कॉल करते समय, कॉम्पोनेंट क्लास का पूरा नाम या पैकेज तय नहीं करता, तब इंप्लिसिट इंटेंट हाइजैक करने की गड़बड़ी होती है. इससे, नुकसान पहुंचाने वाला कोई ऐप्लिकेशन, इंटेंट फ़िल्टर रजिस्टर करके, इंटेंट को चुरा सकता है. ऐसा तब होता है, जब इंटेंट को किसी दूसरे ऐप्लिकेशन के लिए भेजा गया हो.

इंटेंट के कॉन्टेंट के आधार पर, हमलावर संवेदनशील जानकारी को पढ़ सकते हैं या उसमें बदलाव कर सकते हैं. इसके अलावा, वे बदलाव किए जा सकने वाले ऑब्जेक्ट के साथ इंटरैक्ट कर सकते हैं. जैसे, बदलाव किए जा सकने वाले PendingIntents या Binders.

इंप्लिसिट इंटेंट को हाइजैक करने से, हमलावर मनमानी कार्रवाइयां भी कर सकता है. जैसे, हमलावर के कंट्रोल वाले कॉम्पोनेंट लॉन्च करना.

असर

अगर कोई इंप्लिसिट इंटेंट, संवेदनशील डेटा को हैंडल करता है और WebView खोलने के लिए, यूआरएल स्ट्रिंग में सेशन टोकन पास करता है, तो सही इंटेंट फ़िल्टर तय करने वाला कोई भी ऐप्लिकेशन इस टोकन को पढ़ सकता है. इससे, डिवाइस पर सही तरीके से कॉन्फ़िगर किया गया कोई भी ऐप्लिकेशन, इंटेंट को चुरा सकता है और उसमें मौजूद संवेदनशील डेटा को पढ़ सकता है. इससे, हमलावर पीआईआई या सेशन टोकन जैसे डेटा को चुरा सकते हैं.

कम करने के तरीके

जब तक ऐप्लिकेशन के लिए ज़रूरी न हो, तब तक setPackage() को कॉल करके, इंटेंट को एक्सप्लिसिट बनाएं. इससे, इंटेंट को सिर्फ़ कोई खास कॉम्पोनेंट (चाहे वह इन-ऐप्लिकेशन हो या किसी दूसरे ऐप्लिकेशन का) ही इंटरप्रेट कर सकता है. इससे, भरोसेमंद न होने वाले ऐप्लिकेशन, इंटेंट के साथ भेजे गए डेटा को चुरा नहीं सकते. यहां दिया गया स्निपेट, इंटेंट को एक्सप्लिसिट बनाने का तरीका दिखाता है:

Kotlin

val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
    addCategory("android.intent.category.OPENABLE")
    setPackage("com.some.packagename")
    setType("*/*")
    putExtra("android.intent.extra.LOCAL_ONLY", true)
    putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)

Java

Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);

अगर आपको इंप्लिसिट इंटेंट का इस्तेमाल करना है, तो कोई भी संवेदनशील जानकारी या बदलाव किए जा सकने वाले ऑब्जेक्ट शामिल न करें. इंप्लिसिट इंटेंट का इस्तेमाल तब करना पड़ सकता है, जब किसी ऐप्लिकेशन को यह न पता हो कि कौनसे ऐप्लिकेशन से कार्रवाई पूरी होगी. जैसे, ईमेल कंपोज़ करना, फ़ोटो लेना वगैरह.

संसाधन