OWASP कैटगरी: MASVS-PLATFORM: प्लैटफ़ॉर्म इंटरैक्शन
खास जानकारी
नेटिव ब्रिज को कभी-कभी JavaScript ब्रिज भी कहा जाता है. यह एक ऐसा तरीका है जिसकी मदद से, वेबव्यू और नेटिव Android कोड के बीच कम्यूनिकेशन की सुविधा मिलती है. इसके लिए, addJavascriptInterface
तरीके का इस्तेमाल किया जाता है. इससे, वेबव्यू में चल रहे JavaScript कोड और Android ऐप्लिकेशन के Java कोड के बीच, दो-तरफ़ा कम्यूनिकेशन की सुविधा मिलती है. addJavascriptInterface
तरीका किसी Java को दिखाता है
ऑब्जेक्ट को सभी वेबव्यू के फ़्रेम पर ले जाते हैं और कोई भी फ़्रेम ऑब्जेक्ट के नाम को ऐक्सेस कर सकता है
कॉल के तरीके बताए गए हैं. हालांकि, ऐप्लिकेशन के पास वेबव्यू में कॉल करने वाले फ़्रेम की उत्पत्ति की पुष्टि करने का कोई तरीका नहीं है. इससे सुरक्षा से जुड़ी चिंताएं पैदा होती हैं, क्योंकि कॉन्टेंट के भरोसेमंद होने की कोई जानकारी नहीं होती.
एचटीएमएल मैसेज चैनलों के साथ भी नेटिव ब्रिज लागू किया जा सकता है. इसके लिए, JavaScript Window.postMessage
के साथ इंटरैक्ट करने के लिए, Android के WebViewCompat.postWebMessage
या WebMessagePort.postMessage
का इस्तेमाल किया जा सकता है. WebViewCompat.postWebMessage
और
WebMessagePort.postMessage
, Window.postMessage
के ज़रिए भेजे गए JavaScript मैसेज स्वीकार कर सकते हैं. ये मैसेज वेबव्यू में लागू किए जाएंगे.
नेटिव ब्रिज से जुड़े कई जोखिम हैं:
- JavaScript इंटरफ़ेस पर आधारित ब्रिज:
addJavascriptInterface
तरीका, वेबव्यू के हर फ़्रेम में दिए गए Java ऑब्जेक्ट को इंजेक्ट करता है. इसमें iframe भी शामिल हैं. इसका मतलब है कि किसी मान्य वेबसाइट में फ़्रेम इंजेक्ट करने वाले नुकसान पहुंचाने वाले तीसरे पक्षों के हमले का खतरा बना रहता है. एपीआई लेवल 16 या इससे पहले के लेवल को टारगेट करने वाले ऐप्लिकेशन पर, खास तौर पर यह जोखिम हमला इसलिए करें, क्योंकि इस तरीके का इस्तेमाल JavaScript को होस्ट को नियंत्रित करने की अनुमति देने के लिए किया जा सकता है का इस्तेमाल करें.- नेटिव ब्रिज की सुविधा वाले वेबव्यू में, उपयोगकर्ता से मिले गैर-भरोसेमंद कॉन्टेंट को दिखाने से, क्रॉस-साइट स्क्रिप्टिंग (XSS) हमले हो सकते हैं.
- MessageChannel पर आधारित ब्रिज:
- मैसेज चैनल के एंडपॉइंट पर, मैसेज के सोर्स की जांच न करने का मतलब है कि मैसेज किसी भी व्यक्ति से स्वीकार किए जाएंगे. इनमें नुकसान पहुंचाने वाले कोड वाले मैसेज भी शामिल हैं.
- गलती से, Java को आर्बिट्रेरी JavaScript के लिए एक्सपोज़ किया जा सकता है.
असर
addJavascriptInterface
, postWebMessage
, और postMessage
तरीके
नुकसान पहुंचाने वाले लोग या ग्रुप, अपने कंट्रोल किए गए कोड को ऐक्सेस, उसमें हेर-फेर या इंजेक्ट करना
WebView में. इसकी वजह से, उपयोगकर्ताओं को नुकसान पहुंचाने वाली साइटों पर रीडायरेक्ट किया जा सकता है,
नुकसान पहुंचाने वाला कॉन्टेंट लोड किया जा सकता है या उनके डिवाइसों पर नुकसान पहुंचाने वाला कोड चलाया जा सकता है. इस कोड से, संवेदनशील डेटा निकाला जा सकता है या ऐक्सेस लेवल बढ़ाया जा सकता है.
जोखिम: addJavascriptInterface जोखिम
वेबव्यू किसी ब्राउज़र की बेसिक सुविधाओं को लागू करता है, जैसे कि पेज रेंडरिंग,
और JavaScript एक्ज़ीक्यूशन शामिल करें. वेबव्यू का इस्तेमाल किसी ऐप्लिकेशन में किया जा सकता है
का इस्तेमाल, वेब कॉन्टेंट को गतिविधि लेआउट के हिस्से के तौर पर दिखाने के लिए किया जाता है. addJavascriptInterface
तरीके का इस्तेमाल करके, वेबव्यू में नेटिव ब्रिज लागू करने से, क्रॉस-साइट स्क्रिप्टिंग (XSS) जैसी सुरक्षा से जुड़ी समस्याएं हो सकती हैं. इसके अलावा, हमलावर इंटरफ़ेस इंजेक्शन की मदद से गैर-भरोसेमंद कॉन्टेंट लोड कर सकते हैं और होस्ट ऐप्लिकेशन की अनुमतियों के साथ Java कोड को चलाकर, होस्ट ऐप्लिकेशन में अनचाहे तरीके से बदलाव कर सकते हैं.
खतरों को कम करना
JavaScript बंद करें
जिन मामलों में वेबव्यू को JavaScript की ज़रूरत नहीं होती, उनमें WebSettings
में setJavaScriptEnabled
को कॉल न करें. उदाहरण के लिए, स्टैटिक एचटीएमएल कॉन्टेंट दिखाते समय. डिफ़ॉल्ट रूप से,
वेबव्यू.
गैर-भरोसेमंद कॉन्टेंट लोड करते समय, JavaScript इंटरफ़ेस हटाएं
पक्का करें कि WebView से गैर-भरोसेमंद कॉन्टेंट लोड होने से पहले, removeJavascriptInterface
को कॉल करके, JavaScript इंटरफ़ेस से ऑब्जेक्ट हटा दिए जाएं. उदाहरण के लिए, एक कॉल करके ऐसा किया जा सकता है:
shouldInterceptRequest
.
Kotlin
webView.removeJavascriptInterface("myObject")
Java
webView.removeJavascriptInterface("myObject");
सिर्फ़ एचटीटीपीएस पर वेब कॉन्टेंट लोड करें
अगर आपको ऐसा कॉन्टेंट लोड करना है जिस पर भरोसा नहीं किया जा सकता, तो पक्का करें कि वेबव्यू वेब कॉन्टेंट को
एन्क्रिप्ट किया गया कनेक्शन है (Cleartext पर हमारे दिशा-निर्देश भी देखें
कम्यूनिकेशन). शुरुआती पेज लोड को यहां होने से रोकें
android:usesCleartextTraffic
को false
पर सेट करके एन्क्रिप्ट नहीं किए गए कनेक्शन
AndroidManifest
फ़ाइल को सेव करें या नेटवर्क सिक्योरिटी में एचटीटीपी ट्रैफ़िक को अनुमति न दें
config. ज़्यादा जानकारी के लिए, usesCleartextTraffic
दस्तावेज़ देखें.
एक्सएमएल
<application
android:usesCleartextTraffic="false">
<!-- Other application elements -->
</application>
यह पक्का करने के लिए कि एन्क्रिप्ट (सुरक्षित) नहीं किए गए ट्रैफ़िक पर रीडायरेक्ट और ऐप्लिकेशन ब्राउज़िंग न हो, loadUrl
या shouldInterceptRequest
में एचटीटीपी स्कीम देखें:
Kotlin
fun loadSecureUrl(webView: WebView?, url: String?) {
webView?.let { wv -> // Ensure valid WebView and URL
url?.let {
try {
val uri = URI(url)
if (uri.scheme.equals("https", ignoreCase = true)) { // Enforce HTTPS scheme for security
wv.loadUrl(url)
} else {
// Log an error or handle the case where the URL is not secure
System.err.println("Attempted to load a non-HTTPS URL: $url")
}
} catch (e: Exception) {
// Handle exception for improper URL format
System.err.println("Invalid URL syntax: $url")
}
}
}
}
Java
public void loadSecureUrl(WebView webView, String url) {
if (webView != null && url != null) { // Ensure valid WebView and URL
try {
URI uri = new URI(url);
String scheme = uri.getScheme();
if ("https".equalsIgnoreCase(scheme)) { // Enforce HTTPS scheme for security
webView.loadUrl(url);
} else {
// Log an error or handle the case where the URL is not secure
System.err.println("Attempted to load a non-HTTPS URL: " + url);
}
} catch (URISyntaxException e) {
// Handle exception for improper URL format
System.err.println("Invalid URL syntax: " + url);
}
}
}
भरोसेमंद नहीं होने वाले कॉन्टेंट की पुष्टि करना
अगर किसी वेबव्यू में कोई बाहरी लिंक लोड होता है, तो स्कीम और होस्ट, दोनों की पुष्टि करें (जिन लोगों या संगठनों को अनुमति मिली है उनकी सूची वाले डोमेन). अनुमति वाली सूची में शामिल नहीं किए गए डोमेन को, डिफ़ॉल्ट ब्राउज़र बनाएं.
गैर-भरोसेमंद कॉन्टेंट लोड न करें
अगर हो सके, तो सिर्फ़ पूरी तरह से स्कोप वाले यूआरएल और ऐप्लिकेशन के मालिकाना हक वाले कॉन्टेंट को ही लोड करें डेवलपर को वेबव्यू में जोड़ा.
संवेदनशील जानकारी सार्वजनिक न करें
अगर आपका ऐप्लिकेशन किसी वेबव्यू के साथ संवेदनशील डेटा को ऐक्सेस करता है, तो
डिवाइस पर सेव की गई किसी फ़ाइल को मिटाने के लिए, clearCache
का इस्तेमाल करें.
JavaScript इंटरफ़ेस. सर्वर साइड हेडर का भी इस्तेमाल किया जा सकता है. जैसे, 'कोई स्टोर नहीं'
यह दर्शाता है कि किसी ऐप्लिकेशन को कोई खास कॉन्टेंट कैश नहीं करना चाहिए.
संवेदनशील सुविधाओं से जुड़ी जानकारी शेयर न करें
अगर आपके ऐप्लिकेशन को संवेदनशील जानकारी ऐक्सेस करने की अनुमतियां चाहिए या वह संवेदनशील डेटा इकट्ठा करता है, तो पक्का करें कि उसे ऐप्लिकेशन में मौजूद कोड से कॉल किया जाए. साथ ही, उपयोगकर्ताओं को साफ़ तौर पर जानकारी दी जाए. किसी भी संवेदनशील कार्रवाइयों या उपयोगकर्ता के डेटा को ऐक्सेस किया जा सकता है.
एपीआई लेवल 21 या उसके बाद के लेवल को टारगेट करता है
addJavascriptInterface
तरीके का इस्तेमाल करने का एक सुरक्षित तरीका यह है कि एपीआई लेवल 21 या उसके बाद के वर्शन को टारगेट किया जाए. इससे यह पक्का किया जा सकता है कि यह तरीका सिर्फ़ एपीआई लेवल 21 या उसके बाद के वर्शन पर चलने पर ही इस्तेमाल किया जाए. एपीआई वर्शन 21 से पहले, JavaScript लोगों को ऐक्सेस करने के लिए रिफ़्लेक्शन का इस्तेमाल कर सकता था
इंजेक्ट किए गए ऑब्जेक्ट के फ़ील्ड.
जोखिम: MessageChannel के जोखिम
postWebMessage()
और postMessage()
में ऑरिजिन कंट्रोल मौजूद न होने की वजह से, इसकी अनुमति मिल सकती है
हमलावरों को मैसेज भेजने या नेटिव हैंडलर को मैसेज भेजने के लिए कहा जाता है.
जोखिम कम करने के तरीके
postWebMessage()
या postMessage()
सेट अप करते समय, सिर्फ़ भरोसेमंद डोमेन से मैसेज पाने की अनुमति दें. इसके लिए, टारगेट ऑरिजिन के तौर पर * का इस्तेमाल न करें. इसके बजाय, मैसेज भेजने वाले डोमेन की जानकारी साफ़ तौर पर दें.
संसाधन
- postMessage() का इस्तेमाल करने के सबसे सही तरीके
- addJavascriptInterface दस्तावेज़
- postMessage() का दस्तावेज़
- WebMessagePort.postMessage() दस्तावेज़
- WebViewClient.shouldInterceptRequest दस्तावेज़
- addJavascriptInterface से जुड़ी सुरक्षा से जुड़ी सलाह का दस्तावेज़
- clearCache दस्तावेज़
- removeJavascript दस्तावेज़
- वेबव्यू में JavaScript चालू करना