OWASP বিভাগ: MASVS-STORAGE: স্টোরেজ
সংক্ষিপ্ত বিবরণ
এই ডকুমেন্টটিতে ফাইল ইনক্লুশন সম্পর্কিত এমন কয়েকটি সমস্যা আলোচনা করা হয়েছে, যেগুলোর প্রতিকার পদ্ধতি প্রায় একই রকম। এই সমস্যাগুলো মূলত WebView-এর ভেতরের ফাইল অ্যাক্সেস থেকে উদ্ভূত দুর্বলতাকে কেন্দ্র করে গড়ে উঠেছে এবং এর মধ্যে রয়েছে ফাইল অ্যাক্সেসের সুযোগ দেওয়া বা জাভাস্ক্রিপ্ট সক্রিয় করা বিপজ্জনক WebSettings থেকে শুরু করে ফাইল নির্বাচনের অনুরোধ তৈরি করে এমন একটি WebKit মেথড পর্যন্ত। আপনি যদি file:// স্কিমের ব্যবহার, লোকাল ফাইলে অবাধ অ্যাক্সেস এবং ক্রস-সাইট স্ক্রিপ্টিং থেকে উদ্ভূত WebView-এর সমস্যাগুলোর প্রতিকারের জন্য নির্দেশনা খুঁজে থাকেন, তবে এই ডকুমেন্টটি আপনার জন্য সহায়ক হবে।
আরও নির্দিষ্টভাবে বলতে গেলে, এই নথিতে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত রয়েছে:
-
WebSettingsহলো একটি ক্লাস, যার মধ্যে এমন কিছু মেথড রয়েছে যা WebView-এর সেটিং স্টেটগুলো পরিচালনা করে। এই মেথডগুলো WebView-কে বিভিন্ন আক্রমণের ঝুঁকিতে ফেলতে পারে, যা পরবর্তীতে বিস্তারিতভাবে আলোচনা করা হবে। এই ডকুমেন্টে আমরা সেই মেথডগুলো দেখব যা ফাইল অ্যাক্সেস করার পদ্ধতির সাথে সম্পর্কিত, এবং সেই সেটিংটি দেখব যা জাভাস্ক্রিপ্ট এক্সিকিউট করার অনুমতি দেয়: -
setAllowFileAccess,setAllowFileAccessFromFileURLs, এবংsetAllowUniversalAccessFromFileURLsমেথডগুলো একটি ফাইল স্কিম ইউআরএল (file://) ব্যবহার করে লোকাল ফাইলগুলোতে অ্যাক্সেস দেওয়ার জন্য ব্যবহার করা যেতে পারে। তবে, ক্ষতিকারক স্ক্রিপ্টগুলো এই মেথডগুলোকে কাজে লাগিয়ে অ্যাপ্লিকেশনটির অ্যাক্সেস থাকা যেকোনো লোকাল ফাইল, যেমন তাদের নিজস্ব/data/ফোল্ডার, অ্যাক্সেস করতে পারে। এই কারণে, এই মেথডগুলোকে অসুরক্ষিত হিসেবে চিহ্নিত করা হয়েছে এবং API 30-তেWebViewAssetLoaderএর মতো নিরাপদ বিকল্পগুলোর পক্ষে এগুলোকে ডেপ্রিকেটেড করা হয়েছে। - `
setJavascriptEnabledমেথডটি WebView-এর মধ্যে জাভাস্ক্রিপ্ট এক্সিকিউশন সক্ষম করতে ব্যবহার করা যেতে পারে। এর ফলে অ্যাপ্লিকেশনগুলো ফাইল-ভিত্তিক XSS আক্রমণের ঝুঁকিতে পড়ে। বিশেষ করে যখন লোকাল ফাইল বা অবিশ্বস্ত ওয়েব কন্টেন্ট (যেগুলোতে এক্সিকিউটেবল কোড থাকতে পারে) লোড করার অনুমতি দেওয়া হয়, অথবা বাহ্যিক উৎস দ্বারা তৈরি বা পরিবর্তিত হতে পারে এমন ফাইল অ্যাক্সেস করার অনুমতি দেওয়া হয়, কিংবা WebView-কে জাভাস্ক্রিপ্ট এক্সিকিউট করার অনুমতি দেওয়া হয়, তখন ব্যবহারকারী এবং তাদের ডেটা ঝুঁকির মধ্যে পড়ে। -
WebChromeClient.onShowFileChooserহলোandroid.webkitপ্যাকেজের অন্তর্গত একটি মেথড, যা ওয়েব ব্রাউজিং টুল সরবরাহ করে। এই মেথডটি ব্যবহার করে ব্যবহারকারীরা একটি WebView-এর মধ্যে ফাইল নির্বাচন করতে পারেন। তবে, এই ফিচারটির অপব্যবহার হতে পারে, কারণ WebView-গুলো নির্বাচিত ফাইলের উপর কোনো বিধিনিষেধ আরোপ করে না।
প্রভাব
ফাইল অন্তর্ভুক্তিকরণের প্রভাব নির্ভর করতে পারে WebView-তে কোন WebSettings কনফিগার করা আছে তার উপর। অতিরিক্ত বিস্তৃত ফাইল পারমিশন আক্রমণকারীদের স্থানীয় ফাইল অ্যাক্সেস করতে এবং সংবেদনশীল ডেটা, PII (ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য), বা ব্যক্তিগত অ্যাপ ডেটা চুরি করার সুযোগ করে দিতে পারে। জাভাস্ক্রিপ্ট এক্সিকিউশন সক্ষম করা থাকলে আক্রমণকারীরা একটি WebView-এর মধ্যে বা ব্যবহারকারীর ডিভাইসে জাভাস্ক্রিপ্ট চালাতে পারে। onShowFileChooser মেথড ব্যবহার করে নির্বাচিত ফাইলগুলো ব্যবহারকারীর নিরাপত্তা বিঘ্নিত করতে পারে, কারণ ফাইলটির উৎস বিশ্বস্ত কিনা তা নিশ্চিত করার কোনো উপায় ওই মেথড বা WebView-এর থাকে না।
ঝুঁকি: file:// এর মাধ্যমে ফাইল অ্যাক্সেস করা ঝুঁকিপূর্ণ।
setAllowFileAccess , setAllowFileAccessFromFileURLs , এবং setAllowUniversalAccessFromFileURLs সক্রিয় করলে file:// কনটেক্সট সহ ক্ষতিকারক ইন্টেন্ট এবং WebView রিকোয়েস্টগুলো WebView কুকি এবং অ্যাপের ব্যক্তিগত ডেটা সহ যেকোনো স্থানীয় ফাইল অ্যাক্সেস করতে পারে। এছাড়াও, onShowFileChooser মেথড ব্যবহার করে ব্যবহারকারীরা অবিশ্বস্ত উৎস থেকে ফাইল নির্বাচন এবং ডাউনলোড করতে পারে।
অ্যাপ্লিকেশনের কনফিগারেশনের উপর নির্ভর করে, এই সমস্ত পদ্ধতির মাধ্যমে ব্যক্তিগত শনাক্তকরণ তথ্য (PII), লগইন ক্রেডেনশিয়াল বা অন্যান্য সংবেদনশীল তথ্য পাচার হতে পারে।
প্রশমন
ফাইল ইউআরএল যাচাই করুন
If your app requires access to files through file:// URLs, it is important to allowlist only specific URLs that are known to be legitimate, avoiding common mistakes .
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 লেভেল ২৯ ও তার নিচের সংস্করণগুলোতে TRUE এবং API লেভেল ৩০ ও তার উপরের সংস্করণগুলোতে FALSE সেট করা থাকে।
অন্যান্য WebSettings কনফিগার করার প্রয়োজন হলে, এই মেথডগুলোকে স্পষ্টভাবে নিষ্ক্রিয় করে দেওয়াই সবচেয়ে ভালো হবে, বিশেষ করে সেইসব অ্যাপের ক্ষেত্রে যেগুলো ২৯ বা তার কম এপিআই লেভেলকে লক্ষ্য করে তৈরি।
ঝুঁকি: ফাইল-ভিত্তিক XSS
setJavacriptEnabled মেথডটিকে TRUE তে সেট করলে একটি WebView-এর মধ্যে জাভাস্ক্রিপ্ট চালানো যায়, এবং পূর্বে বর্ণিত ফাইল অ্যাক্সেস সক্ষম করার সাথে মিলিতভাবে, যেকোনো ফাইলের কোড বা WebView-এর মধ্যে খোলা ক্ষতিকারক ওয়েবসাইট চালানোর মাধ্যমে ফাইল-ভিত্তিক XSS আক্রমণ সম্ভব।
প্রশমন
ওয়েবভিউকে স্থানীয় ফাইল লোড করা থেকে বিরত রাখুন
পূর্ববর্তী ঝুঁকির মতোই, setAllowFileAccess() , setAllowFileAccessFromFileURLs() , এবং setAllowUniversalAccessFromFileURLs() -কে FALSE এ সেট করা থাকলে ফাইল-ভিত্তিক XSS এড়ানো যেতে পারে।
ওয়েবভিউতে জাভাস্ক্রিপ্ট চালানো প্রতিরোধ করুন
setJavascriptEnabled মেথডটির মান FALSE সেট করুন, যাতে WebViews-এর ভেতরে জাভাস্ক্রিপ্ট চালানো না যায়।
ওয়েবভিউ যেন অবিশ্বস্ত কন্টেন্ট লোড না করে তা নিশ্চিত করুন।
কখনও কখনও ওয়েবভিউ-এর মধ্যে এই সেটিংসগুলো চালু করা প্রয়োজন হয়। এক্ষেত্রে, শুধুমাত্র বিশ্বস্ত কন্টেন্ট লোড হচ্ছে কিনা তা নিশ্চিত করা জরুরি। জাভাস্ক্রিপ্টের এক্সিকিউশনকে শুধুমাত্র আপনার নিয়ন্ত্রণে থাকা অংশে সীমাবদ্ধ রাখা এবং যথেচ্ছ জাভাস্ক্রিপ্টকে নিষিদ্ধ করা হলো কন্টেন্টের বিশ্বাসযোগ্যতা নিশ্চিত করার একটি ভালো উপায়। অন্যথায়, ক্লিয়ারটেক্সট ট্র্যাফিক লোড হওয়া থেকে বিরত রাখলে এটা নিশ্চিত হয় যে বিপজ্জনক সেটিংসযুক্ত ওয়েবভিউগুলো অন্তত HTTP URL লোড করতে পারবে না। এটি ম্যানিফেস্টের মাধ্যমে android:usesCleartextTraffic কে False সেট করে, অথবা এমন একটি Network Security Config সেট করে করা যেতে পারে যা HTTP ট্র্যাফিককে নিষিদ্ধ করে।
সম্পদ
- setAllowUniversalAccessFromFileURLs এপিআই রেফারেন্স পৃষ্ঠা
- setAllowFileAccessFromFileURLs এপিআই রেফারেন্স পৃষ্ঠা
- WebViewAssetLoader API রেফারেন্স পৃষ্ঠা
- CodeQL ডকুমেন্টেশন
- অতিরিক্ত সুরক্ষিত ব্লগ
- onShowFileChooser রেফারেন্স পৃষ্ঠা