वेबव्यू – असुरक्षित फ़ाइल शामिल करना

OWASP कैटगरी: MASVS-STORAGE: Storage

खास जानकारी

इस दस्तावेज़ में, फ़ाइल शामिल करने से जुड़ी कई समस्याओं के बारे में बताया गया है. इन समस्याओं को ठीक करने के तरीके एक जैसे हैं. ये समस्याएं, WebViews में मौजूद फ़ाइलों को ऐक्सेस करने से जुड़ी कमज़ोरियों की वजह से होती हैं. इनमें फ़ाइल ऐक्सेस करने की अनुमति देने या JavaScript को चालू करने जैसी खतरनाक WebSettings सेटिंग से लेकर, फ़ाइल चुनने का अनुरोध करने वाली WebKit विधि तक की समस्याएं शामिल हैं. अगर आपको file:// स्कीम, लोकल फ़ाइलों के लिए बिना किसी पाबंदी के ऐक्सेस, और क्रॉस-साइट स्क्रिप्टिंग के इस्तेमाल की वजह से, वेबव्यू में आने वाली समस्याओं को ठीक करने के बारे में दिशा-निर्देश चाहिए, तो यह दस्तावेज़ आपके लिए मददगार हो सकता है.

इस दस्तावेज़ में इन विषयों के बारे में बताया गया है:

  • WebSettings एक क्लास है. इसमें ऐसे तरीके शामिल होते हैं जो WebViews के लिए सेटिंग की स्थितियों को मैनेज करते हैं. इन तरीकों से, WebViews को अलग-अलग तरह के हमलों के लिए खोला जा सकता है. इनके बारे में बाद में बताया जाएगा. इस दस्तावेज़ में, हम उन तरीकों के बारे में जानेंगे जिनसे फ़ाइलों को ऐक्सेस किया जा सकता है. साथ ही, हम उस सेटिंग के बारे में भी जानेंगे जिससे JavaScript को एक्ज़ीक्यूट करने की अनुमति मिलती है:
  • setAllowFileAccess, setAllowFileAccessFromFileURLs, और setAllowUniversalAccessFromFileURLs तरीकों का इस्तेमाल करके, लोकल फ़ाइलों को ऐक्सेस करने की अनुमति दी जा सकती है. इसके लिए, फ़ाइल स्कीम वाले यूआरएल (file://) का इस्तेमाल किया जाता है. हालांकि, नुकसान पहुंचाने वाली स्क्रिप्ट इनका इस्तेमाल करके, ऐसी लोकल फ़ाइलों को ऐक्सेस कर सकती हैं जिन्हें ऐप्लिकेशन ऐक्सेस कर सकता है. जैसे, उनका अपना /data/ फ़ोल्डर. इस वजह से, इन तरीकों को असुरक्षित के तौर पर फ़्लैग किया गया है. साथ ही, एपीआई 30 में इन्हें बंद कर दिया गया है. इनकी जगह, WebViewAssetLoader जैसे ज़्यादा सुरक्षित विकल्पों का इस्तेमाल किया जा सकता है.
  • setJavascriptEnabled तरीके का इस्तेमाल, WebViews में JavaScript को लागू करने के लिए किया जा सकता है. इससे ऐप्लिकेशन पर फ़ाइल बेस्ड XSS का हमला होने की आशंका बढ़ जाती है. खास तौर पर, जब इसे लोकल फ़ाइलें लोड करने या ऐसे वेब कॉन्टेंट को लोड करने की अनुमति देने के लिए कॉन्फ़िगर किया जाता है जिस पर भरोसा नहीं किया जा सकता. इस कॉन्टेंट में एक्ज़ीक्यूटेबल कोड हो सकता है. इसके अलावा, इसे ऐसी फ़ाइलों को ऐक्सेस करने की अनुमति देने के लिए कॉन्फ़िगर किया जाता है जिन्हें बाहरी सोर्स बना सकते हैं या बदल सकते हैं. साथ ही, WebViews को JavaScript एक्ज़ीक्यूट करने की अनुमति देने पर, उपयोगकर्ताओं और उनके डेटा को जोखिम होता है.
  • WebChromeClient.onShowFileChooser, android.webkit पैकेज का एक तरीका है. यह वेब ब्राउज़िंग टूल उपलब्ध कराता है. इस तरीके का इस्तेमाल, उपयोगकर्ताओं को वेबव्यू में फ़ाइलें चुनने की अनुमति देने के लिए किया जा सकता है. हालांकि, इस सुविधा का गलत इस्तेमाल किया जा सकता है, क्योंकि WebViews यह पाबंदी नहीं लगाते कि कौनसी फ़ाइल चुनी गई है.

असर

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

जोखिम: file:// के ज़रिए फ़ाइलों का जोखिम भरा ऐक्सेस

setAllowFileAccess, setAllowFileAccessFromFileURLs, और setAllowUniversalAccessFromFileURLs को चालू करने से, दुर्भावनापूर्ण इरादे से किए गए कामों और file:// कॉन्टेक्स्ट के साथ WebView अनुरोधों को, स्थानीय फ़ाइलों को ऐक्सेस करने की अनुमति मिल सकती है. इनमें WebView कुकी और ऐप्लिकेशन का निजी डेटा शामिल है. इसके अलावा, onShowFileChooser तरीके का इस्तेमाल करके, लोग गैर-भरोसेमंद सोर्स से फ़ाइलें चुनकर डाउनलोड कर सकते हैं.

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

जोखिम कम करने के तरीके

फ़ाइल के यूआरएल की पुष्टि करना

अगर आपके ऐप्लिकेशन को file:// यूआरएल के ज़रिए फ़ाइलों को ऐक्सेस करने की ज़रूरत है, तो सिर्फ़ उन यूआरएल को अनुमति वाली सूची में शामिल करें जो भरोसेमंद हैं. साथ ही, सामान्य गलतियां करने से बचें.

WebViewAssetLoader का इस्तेमाल करना

बताए गए तरीकों के बजाय, WebViewAssetLoader का इस्तेमाल करें. इस तरीके में, लोकल फ़ाइल सिस्टम ऐसेट को ऐक्सेस करने के लिए, file:// स्कीम के बजाय http(s)//: स्कीम का इस्तेमाल किया जाता है. साथ ही, यह बताए गए हमले से सुरक्षित है.

Kotlin

val assetLoader: WebViewAssetLoader = Builder()
  .addPathHandler("/assets/", AssetsPathHandler(this))
  .build()

webView.setWebViewClient(object : WebViewClientCompat() {
  @RequiresApi(21)
  override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse {
    return assetLoader.shouldInterceptRequest(request.url)
  }

  @Suppress("deprecation") // for API < 21
  override fun shouldInterceptRequest(view: WebView?, url: String?): WebResourceResponse {
    return assetLoader.shouldInterceptRequest(Uri.parse(url))
  }
})

val webViewSettings: WebSettings = webView.getSettings()
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.allowFileAccessFromFileURLs = false
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.allowUniversalAccessFromFileURLs = false
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.allowFileAccess = false
webViewSettings.allowContentAccess = false

// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webView.loadUrl("https://appassets.androidplatform.net/assets/www/index.html")

Java

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
         .addPathHandler("/assets/", new AssetsPathHandler(this))
         .build();

webView.setWebViewClient(new WebViewClientCompat() {
    @Override
    @RequiresApi(21)
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        return assetLoader.shouldInterceptRequest(request.getUrl());
    }

    @Override
    @SuppressWarnings("deprecation") // for API < 21
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        return assetLoader.shouldInterceptRequest(Uri.parse(url));
    }
});

WebSettings webViewSettings = webView.getSettings();
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.setAllowFileAccessFromFileURLs(false);
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.setAllowUniversalAccessFromFileURLs(false);
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.setAllowFileAccess(false);
webViewSettings.setAllowContentAccess(false);

// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");

खतरनाक WebSettings के तरीकों को बंद करना

एपीआई लेवल 29 और इससे पहले के लेवल में, setAllowFileAccess(), setAllowFileAccessFromFileURLs(), और setAllowUniversalAccessFromFileURLs() तरीकों की वैल्यू डिफ़ॉल्ट रूप से TRUE पर सेट होती हैं. वहीं, एपीआई लेवल 30 और इसके बाद के लेवल में, इनकी वैल्यू FALSE पर सेट होती हैं.

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


जोखिम: फ़ाइल-बेस्ड XSS

setJavacriptEnabled तरीके को TRUE पर सेट करने से, JavaScript को वेबव्यू में एक्ज़ीक्यूट किया जा सकता है. साथ ही, फ़ाइल ऐक्सेस करने की सुविधा चालू होने पर, फ़ाइल पर आधारित XSS का इस्तेमाल किया जा सकता है. ऐसा किसी भी फ़ाइल में कोड को एक्ज़ीक्यूट करके या वेबव्यू में खोले गए नुकसान पहुंचाने वाले वेबसाइटों के ज़रिए किया जा सकता है.

जोखिम कम करने के तरीके

WebViews को लोकल फ़ाइलें लोड करने से रोकना

पिछले जोखिम की तरह, फ़ाइल बेस्ड XSS से भी बचा जा सकता है. इसके लिए, setAllowFileAccess(), setAllowFileAccessFromFileURLs(), और setAllowUniversalAccessFromFileURLs() को FALSE पर सेट करना होगा.

WebViews को JavaScript चलाने से रोकना

तरीके setJavascriptEnabled को FALSE पर सेट करें, ताकि WebViews में JavaScript को लागू न किया जा सके.

पक्का करें कि WebViews से ऐसा कॉन्टेंट लोड न हो जिस पर भरोसा नहीं किया जा सकता

कभी-कभी वेबव्यू में इन सेटिंग को चालू करना ज़रूरी होता है. ऐसे में, यह पक्का करना ज़रूरी है कि सिर्फ़ भरोसेमंद कॉन्टेंट लोड हो. JavaScript को सिर्फ़ उस कॉन्टेंट को चलाने की अनुमति दें जिसे कंट्रोल किया जा सकता है. साथ ही, किसी भी JavaScript को चलाने की अनुमति न दें. इससे यह पक्का किया जा सकता है कि कॉन्टेंट भरोसेमंद है. इसके अलावा, क्लियरटेक्स्ट ट्रैफ़िक को लोड होने से रोकने पर यह पक्का किया जा सकता है कि खतरनाक सेटिंग वाले WebViews, कम से कम एचटीटीपी यूआरएल लोड न कर पाएं. ऐसा मेनिफ़ेस्ट के ज़रिए किया जा सकता है. इसके लिए, android:usesCleartextTraffic को False पर सेट करें. इसके अलावा, Network Security Config को सेट करके भी ऐसा किया जा सकता है, जो एचटीटीपी ट्रैफ़िक की अनुमति नहीं देता.


संसाधन