ওয়েবভিউ - অনিরাপদ ফাইল অন্তর্ভুক্তি

OWASP বিভাগ: MASVS-স্টোরেজ: স্টোরেজ

ওভারভিউ

এই নথিতে ফাইল অন্তর্ভুক্তি সম্পর্কিত বেশ কয়েকটি সমস্যা রয়েছে যা অনুরূপ প্রশমন ভাগ করে। এই সমস্যাগুলি ওয়েবভিউগুলির মধ্যে ফাইলগুলিতে অ্যাক্সেস থেকে উদ্ভূত দুর্বলতার উপর কেন্দ্রীভূত হয় এবং বিপজ্জনক WebSettings থেকে ফাইল অ্যাক্সেসের অনুমতি দেয় বা জাভাস্ক্রিপ্ট সক্ষম করে এমন একটি ওয়েবকিট পদ্ধতি যা ফাইল নির্বাচনের অনুরোধ তৈরি করে। এই নথিটি সহায়ক হবে যদি আপনি WebView-এর মধ্যে file:// স্কিমের ব্যবহার, স্থানীয় ফাইলগুলিতে সীমাহীন অ্যাক্সেস এবং ক্রস-সাইট স্ক্রিপ্টিং থেকে উদ্ভূত সমস্যাগুলির প্রতিকারের নির্দেশিকা খুঁজছেন।

আরও দৃঢ়ভাবে, এই নথিতে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত রয়েছে:

  • WebSettings হল একটি ক্লাস যার মধ্যে পদ্ধতি রয়েছে যা WebViews-এর জন্য সেটিং অবস্থা পরিচালনা করে। এই পদ্ধতিগুলি বিভিন্ন আক্রমণের জন্য WebViews খুলতে পারে যা পরে রূপরেখা দেওয়া হবে। এই নথিতে আমরা সেই পদ্ধতিগুলি দেখব যেগুলি কীভাবে ফাইলগুলি অ্যাক্সেস করা যায় এবং সেটিং যা জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়:
  • setAllowFileAccess , setAllowFileAccessFromFileURLs , এবং setAllowUniversalAccessFromFileURLs পদ্ধতিগুলি একটি ফাইল স্কিম URL ( file:// ) ব্যবহার করে স্থানীয় ফাইলগুলিতে অ্যাক্সেস দেওয়ার জন্য ব্যবহার করা যেতে পারে। যাইহোক, তারা দূষিত স্ক্রিপ্ট দ্বারা শোষিত হতে পারে নির্বিচারে স্থানীয় ফাইলগুলিতে অ্যাক্সেস করতে যা অ্যাপ্লিকেশনটির অ্যাক্সেস রয়েছে, যেমন তাদের নিজস্ব /data/ ফোল্ডার। এই কারণে, এই পদ্ধতিগুলিকে অনিরাপদ হিসাবে পতাকাঙ্কিত করা হয়েছে এবং WebViewAssetLoader এর মতো নিরাপদ বিকল্পগুলির পক্ষে API 30-এ অবমূল্যায়িত করা হয়েছে।
  • WebViews-এর মধ্যে JavaScript কার্যকর করতে setJavascriptEnabled পদ্ধতি ব্যবহার করা যেতে পারে। এটি অ্যাপ্লিকেশনগুলিকে ফাইল-ভিত্তিক XSS-এর জন্য দুর্বল করে দেয়। বিশেষ করে যখন স্থানীয় ফাইল বা অবিশ্বস্ত ওয়েব সামগ্রী লোড করার অনুমতি দেওয়ার জন্য কনফিগার করা হয় যাতে এক্সিকিউটেবল কোড থাকতে পারে, বহিরাগত উত্স দ্বারা তৈরি বা পরিবর্তন করা যায় এমন ফাইলগুলিতে অ্যাক্সেসের অনুমতি দেওয়ার জন্য কনফিগার করা হয়, বা ওয়েবভিউকে জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়, ব্যবহারকারী এবং তাদের ডেটা ঝুঁকির মধ্যে পড়ে .
  • WebChromeClient.onShowFileChooser হল android.webkit প্যাকেজের অন্তর্গত একটি পদ্ধতি, যা ওয়েব ব্রাউজিং টুল প্রদান করে। এই পদ্ধতিটি ব্যবহারকারীদের একটি WebView এর মধ্যে ফাইল নির্বাচন করার অনুমতি দিতে ব্যবহার করা যেতে পারে। যাইহোক, এই বৈশিষ্ট্যটি অপব্যবহার করা যেতে পারে কারণ WebViews কোন ফাইলটি নির্বাচন করা হয়েছে তার উপর বিধিনিষেধ প্রয়োগ করে না।

প্রভাব

ফাইল অন্তর্ভুক্তির প্রভাব WebView-এ কোন WebSettings কনফিগার করা হয়েছে তার উপর নির্ভর করতে পারে। অত্যধিক বিস্তৃত ফাইলের অনুমতি আক্রমণকারীদের স্থানীয় ফাইলগুলি অ্যাক্সেস করতে এবং সংবেদনশীল ডেটা, PII (ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য) বা ব্যক্তিগত অ্যাপ ডেটা চুরি করতে দেয়। জাভাস্ক্রিপ্ট এক্সিকিউশন সক্রিয় করা আক্রমণকারীদের ওয়েবভিউ বা ব্যবহারকারীর ডিভাইসে জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়। onShowFileChooser পদ্ধতি ব্যবহার করে নির্বাচিত ফাইলগুলি ব্যবহারকারীর নিরাপত্তার সাথে আপস করতে পারে কারণ ফাইলের উত্সটি বিশ্বস্ত কিনা তা নিশ্চিত করার পদ্ধতি বা WebView এর জন্য কোন উপায় নেই৷

ঝুঁকি: ফাইলের মাধ্যমে ফাইলগুলিতে ঝুঁকিপূর্ণ অ্যাক্সেস:://

setAllowFileAccess , setAllowFileAccessFromFileURLs , এবং setAllowUniversalAccessFromFileURLs সক্ষম করার ফলে ওয়েবভিউ কুকিজ এবং অ্যাপ ব্যক্তিগত ডেটা সহ নির্বিচারে স্থানীয় ফাইলগুলি অ্যাক্সেস করার জন্য একটি file:// প্রসঙ্গ সহ দূষিত উদ্দেশ্য এবং WebView অনুরোধগুলিকে অনুমতি দিতে পারে৷ অধিকন্তু, onShowFileChooser পদ্ধতি ব্যবহার করে ব্যবহারকারীরা অবিশ্বস্ত উৎস থেকে ফাইল নির্বাচন এবং ডাউনলোড করতে পারবেন।

এই পদ্ধতিগুলি সমস্ত অ্যাপ্লিকেশন কনফিগারেশনের উপর নির্ভর করে PII, লগইন শংসাপত্র, বা অন্যান্য সংবেদনশীল ডেটার বহিঃপ্রকাশ ঘটাতে পারে।

প্রশমন

ফাইল URL গুলি যাচাই করুন৷

আপনার অ্যাপের যদি file:// URL-এর মাধ্যমে ফাইলগুলিতে অ্যাক্সেসের প্রয়োজন হয়, তাহলে সাধারণ ভুলগুলি এড়িয়ে শুধুমাত্র বৈধ বলে পরিচিত নির্দিষ্ট URLগুলিকে অনুমতি দেওয়া গুরুত্বপূর্ণ৷

WebViewAssetLoader ব্যবহার করুন

উল্লেখিত পদ্ধতির পরিবর্তে WebViewAssetLoader ব্যবহার করুন। স্থানীয় ফাইল সিস্টেম সম্পদগুলি অ্যাক্সেস করতে এই পদ্ধতিটি file:// স্কিমের পরিবর্তে http(s)//: স্কিম ব্যবহার করে এবং বর্ণিত আক্রমণের জন্য ঝুঁকিপূর্ণ নয়।

কোটলিন

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")

জাভা

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");

বিপজ্জনক ওয়েবসেটিংস পদ্ধতি অক্ষম করুন

setAllowFileAccess() , setAllowFileAccessFromFileURLs() , এবং setAllowUniversalAccessFromFileURLs() পদ্ধতির মানগুলি ডিফল্টরূপে API স্তর 29 এবং নীচের ক্ষেত্রে TRUE এবং API স্তর 30 এবং উচ্চতর ক্ষেত্রে FALSE সেট করা হয়৷

যদি অন্য WebSettings কনফিগার করার প্রয়োজন হয়, তাহলে এই পদ্ধতিগুলিকে স্পষ্টভাবে অক্ষম করা ভাল হবে, বিশেষ করে 29-এর থেকে কম বা সমান API স্তরগুলিকে লক্ষ্য করে এমন অ্যাপগুলির জন্য৷


ঝুঁকি: ফাইল-ভিত্তিক XSS

setJavacriptEnabled পদ্ধতিটিকে TRUE তে সেট করা জাভাস্ক্রিপ্টকে একটি WebView-এর মধ্যে চালানোর অনুমতি দেয়, এবং পূর্বে বর্ণিত ফাইল অ্যাক্সেস সক্ষম করার সংমিশ্রণে, ফাইল-ভিত্তিক XSS নির্বিচারে ফাইলগুলির মধ্যে কোড চালানোর মাধ্যমে বা WebView এর মধ্যে খোলা ক্ষতিকারক ওয়েবসাইটগুলির মাধ্যমে সম্ভব।

প্রশমন

স্থানীয় ফাইল লোড করা থেকে WebViews প্রতিরোধ করুন

আগের ঝুঁকির মতো, ফাইল-ভিত্তিক XSS এড়ানো যেতে পারে যদি setAllowFileAccess() , setAllowFileAccessFromFileURLs() , এবং setAllowUniversalAccessFromFileURLs() FALSE এ সেট করা থাকে।

JavaScript কার্যকর করা WebViews প্রতিরোধ করুন

setJavascriptEnabled সেটটিকে FALSE তে সেট করুন যাতে JavaScript WebViews-এর মধ্যে কার্যকর করা না যায়।

WebViews অবিশ্বস্ত কন্টেন্ট লোড না নিশ্চিত করুন

কখনও কখনও WebViews-এর মধ্যে এই সেটিংস সক্রিয় করা প্রয়োজন৷ এই ক্ষেত্রে, শুধুমাত্র বিশ্বস্ত বিষয়বস্তু লোড করা হয়েছে তা নিশ্চিত করা গুরুত্বপূর্ণ। জাভাস্ক্রিপ্টের এক্সিকিউশনকে শুধুমাত্র আপনার নিয়ন্ত্রণে সীমিত করা এবং নির্বিচারে জাভাস্ক্রিপ্টের অনুমতি না দেওয়া বিষয়বস্তু বিশ্বাসযোগ্য তা নিশ্চিত করার একটি ভাল উপায়। অন্যথায়, ক্লিয়ারটেক্সট ট্রাফিক লোড হওয়া থেকে আটকানো নিশ্চিত করে যে বিপজ্জনক সেটিংস সহ WebViews অন্তত HTTP URL লোড করতে সক্ষম নয়। এটি ম্যানিফেস্টের মাধ্যমে করা যেতে পারে, android:usesCleartextTraffic তে False সেট করে, অথবা HTTP ট্র্যাফিকের অনুমতি না দেয় এমন একটি Network Security Config সেট করে।


সম্পদ