OWASP বিভাগ: MASVS-PLATFORM: প্ল্যাটফর্ম মিথস্ক্রিয়া
সংক্ষিপ্ত বিবরণ
একটি নেটিভ ব্রিজ, যা কখনও কখনও জাভাস্ক্রিপ্ট ব্রিজ নামেও পরিচিত, হলো একটি ব্যবস্থা যা addJavascriptInterface মেথড ব্যবহারের মাধ্যমে একটি WebView এবং নেটিভ অ্যান্ড্রয়েড কোডের মধ্যে যোগাযোগ সহজ করে। এটি WebView-তে চলমান জাভাস্ক্রিপ্ট কোড এবং অ্যান্ড্রয়েড অ্যাপ্লিকেশনের জাভা কোডের মধ্যে দ্বিমুখী যোগাযোগের সুযোগ করে দেয়। ` addJavascriptInterface মেথডটি একটি WebView-এর সমস্ত ফ্রেমের কাছে একটি জাভা অবজেক্ট উন্মুক্ত করে দেয়, এবং যেকোনো ফ্রেম সেই অবজেক্টের নাম অ্যাক্সেস করতে ও এর মেথডগুলো কল করতে পারে। তবে, WebView-এর মধ্যে অ্যাপ্লিকেশনটির পক্ষে কলিং ফ্রেমের উৎস যাচাই করার কোনো ব্যবস্থা নেই, যা নিরাপত্তাজনিত উদ্বেগ তৈরি করে, কারণ এর বিষয়বস্তুর বিশ্বাসযোগ্যতা অনির্ধারিত থেকে যায়।
জাভাস্ক্রিপ্ট Window.postMessage এর সাথে যোগাযোগের জন্য অ্যান্ড্রয়েডের WebViewCompat.postWebMessage বা WebMessagePort.postMessage ব্যবহার করে HTML মেসেজ চ্যানেলের মাধ্যমে একটি নেটিভ ব্রিজও বাস্তবায়ন করা যেতে পারে। WebViewCompat.postWebMessage এবং WebMessagePort.postMessage , Window.postMessage এর মাধ্যমে পাঠানো জাভাস্ক্রিপ্ট মেসেজ গ্রহণ করতে পারে, যা WebView-এর ভেতরে এক্সিকিউট হবে।
প্রাকৃতিক সেতুগুলির সাথে একাধিক ঝুঁকি জড়িত রয়েছে:
- জাভাস্ক্রিপ্ট ইন্টারফেস-ভিত্তিক ব্রিজ:
-
addJavascriptInterfaceমেথডটি WebView-এর প্রতিটি ফ্রেমে, এমনকি iframe-এও, একটি সরবরাহকৃত জাভা অবজেক্ট ইনজেক্ট করে। এর ফলে, কোনো বৈধ ওয়েবসাইটে ফ্রেম ইনজেক্ট করার মাধ্যমে ক্ষতিকারক তৃতীয় পক্ষের আক্রমণের শিকার হওয়ার ঝুঁকি থাকে। API লেভেল ১৬ বা তার আগের সংস্করণকে লক্ষ্য করে তৈরি অ্যাপ্লিকেশনগুলো আক্রমণের বিশেষ ঝুঁকিতে থাকে, কারণ এই মেথডটি ব্যবহার করে জাভাস্ক্রিপ্টকে হোস্ট অ্যাপ্লিকেশন নিয়ন্ত্রণ করার সুযোগ দেওয়া যেতে পারে। - নেটিভ ব্রিজ-সক্ষম ওয়েবভিউতে অবিশ্বস্ত ব্যবহারকারী-প্রদত্ত কন্টেন্ট প্রতিফলিত হলে ক্রস-সাইট স্ক্রিপ্টিং (XSS) আক্রমণের সুযোগ তৈরি হয়।
-
- মেসেজচ্যানেল-ভিত্তিক ব্রিজ:
- মেসেজ চ্যানেল এন্ডপয়েন্টগুলিতে উৎস যাচাইয়ের অভাবের কারণে যেকোনো প্রেরকের কাছ থেকে মেসেজ গৃহীত হবে, যার মধ্যে ক্ষতিকারক কোডযুক্ত মেসেজও অন্তর্ভুক্ত।
- ভুলবশত জাভাকে যেকোনো জাভাস্ক্রিপ্টের সংস্পর্শে আনা সম্ভব।
প্রভাব
addJavascriptInterface , postWebMessage , এবং postMessage মেথডগুলো ব্যবহার করে ক্ষতিকারক ব্যক্তিরা একটি WebView-তে তাদের নিয়ন্ত্রিত কোড অ্যাক্সেস, ম্যানিপুলেট বা ইনজেক্ট করতে পারে। এর ফলে ব্যবহারকারীরা ক্ষতিকারক সাইটে রিডাইরেক্ট হতে পারেন, ক্ষতিকারক কন্টেন্ট লোড হতে পারে, অথবা তাদের ডিভাইসে এমন ক্ষতিকারক কোড চলতে পারে যা সংবেদনশীল ডেটা বের করে নিতে পারে বা প্রিভিলেজ এসকেলেশন ঘটাতে পারে।
ঝুঁকি: addJavascriptInterface-এর ঝুঁকি
ওয়েবভিউ একটি ব্রাউজারের মৌলিক কার্যকারিতাগুলো বাস্তবায়ন করে, যেমন পৃষ্ঠা রেন্ডারিং, নেভিগেশন এবং জাভাস্ক্রিপ্ট এক্সিকিউশন। একটি অ্যাপ্লিকেশনের ভেতরে অ্যাক্টিভিটি লেআউটের অংশ হিসেবে ওয়েব কন্টেন্ট প্রদর্শন করতে ওয়েবভিউ ব্যবহার করা যেতে পারে। addJavascriptInterface মেথড ব্যবহার করে ওয়েবভিউ-এর মধ্যে একটি নেটিভ ব্রিজ বাস্তবায়ন করলে ক্রস-সাইট স্ক্রিপ্টিং (XSS)-এর মতো নিরাপত্তাজনিত সমস্যা তৈরি হতে পারে, অথবা আক্রমণকারীরা ইন্টারফেস ইনজেকশনের মাধ্যমে অবিশ্বস্ত কন্টেন্ট লোড করতে পারে এবং হোস্ট অ্যাপ্লিকেশনের অনুমতি নিয়ে জাভা কোড এক্সিকিউট করে হোস্ট অ্যাপ্লিকেশনটিকে অনাকাঙ্ক্ষিত উপায়ে ম্যানিপুলেট করতে পারে।
প্রশমন
জাভাস্ক্রিপ্ট নিষ্ক্রিয় করুন
যেসব ক্ষেত্রে WebView-এর জন্য জাভাস্ক্রিপ্টের প্রয়োজন হয় না, সেসব ক্ষেত্রে WebSettings মধ্যে setJavaScriptEnabled কল করবেন না (উদাহরণস্বরূপ, স্ট্যাটিক HTML কন্টেন্ট প্রদর্শন করার সময়)। ডিফল্টরূপে, WebView-তে জাভাস্ক্রিপ্ট এক্সিকিউশন নিষ্ক্রিয় থাকে।
অবিশ্বস্ত কন্টেন্ট লোড করার সময় জাভাস্ক্রিপ্ট ইন্টারফেস অপসারণ করুন
WebView-তে অবিশ্বস্ত কন্টেন্ট লোড হওয়ার আগে removeJavascriptInterface কল করে জাভাস্ক্রিপ্ট ইন্টারফেস থেকে অবজেক্টগুলো সরিয়ে ফেলা নিশ্চিত করুন। উদাহরণস্বরূপ, shouldInterceptRequest কল করার মাধ্যমে এটি করা যেতে পারে।
কোটলিন
webView.removeJavascriptInterface("myObject")
জাভা
webView.removeJavascriptInterface("myObject");
শুধুমাত্র HTTPS এর মাধ্যমে ওয়েব কন্টেন্ট লোড করুন
যদি আপনাকে অবিশ্বস্ত কন্টেন্ট লোড করতে হয়, তবে নিশ্চিত করুন যে WebView একটি এনক্রিপ্টেড সংযোগের মাধ্যমে ওয়েব কন্টেন্ট লোড করছে (আমাদের ক্লিয়ারটেক্সট কমিউনিকেশন সংক্রান্ত নির্দেশিকাও দেখুন)। AndroidManifest ফাইলে android:usesCleartextTraffic কে false সেট করে অথবা নেটওয়ার্ক সিকিউরিটি কনফিগে HTTP ট্র্যাফিক নিষিদ্ধ করে, এনক্রিপ্টেড নয় এমন সংযোগে প্রাথমিক পেজ লোড হওয়া প্রতিরোধ করুন। আরও তথ্যের জন্য usesCleartextTraffic ডকুমেন্টেশন দেখুন।
এক্সএমএল
<application
android:usesCleartextTraffic="false">
<!-- Other application elements -->
</application>
এনক্রিপ্ট করা নয় এমন ট্র্যাফিকের উপর যেন রিডাইরেক্ট এবং অ্যাপের পরবর্তী ব্রাউজিং না ঘটে, তা নিশ্চিত করতে loadUrl অথবা shouldInterceptRequest এ HTTP স্কিমটি পরীক্ষা করুন:
কোটলিন
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")
}
}
}
}
জাভা
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);
}
}
}
অবিশ্বস্ত বিষয়বস্তু যাচাই করুন
যদি কোনো WebView-তে বাহ্যিক লিঙ্ক লোড করা হয়, তাহলে স্কিম এবং হোস্ট উভয়ই যাচাই করুন (অনুমোদিত ডোমেইন)। অনুমোদিত তালিকায় নেই এমন যেকোনো ডোমেইন পরিবর্তে ডিফল্ট ব্রাউজার দিয়ে খোলা উচিত।
অবিশ্বস্ত কন্টেন্ট লোড করবেন না।
সম্ভব হলে, WebView-তে শুধুমাত্র নির্দিষ্ট পরিধির URL এবং অ্যাপ ডেভেলপারের মালিকানাধীন কন্টেন্ট লোড করুন।
সংবেদনশীল তথ্য প্রকাশ করবেন না।
আপনার অ্যাপ্লিকেশন যদি WebView-এর মাধ্যমে সংবেদনশীল ডেটা অ্যাক্সেস করে, তাহলে জাভাস্ক্রিপ্ট ইন্টারফেস ব্যবহার করার আগে স্থানীয়ভাবে সংরক্ষিত ফাইলগুলো মুছে ফেলার জন্য clearCache মেথডটি ব্যবহার করার কথা বিবেচনা করুন। এছাড়াও, কোনো অ্যাপ্লিকেশন যাতে নির্দিষ্ট কন্টেন্ট ক্যাশ না করে, তা বোঝানোর জন্য আপনি no-store-এর মতো সার্ভার-সাইড হেডারও ব্যবহার করতে পারেন।
সংবেদনশীল কার্যকারিতা প্রকাশ করবেন না।
যদি আপনার অ্যাপ্লিকেশনের সংবেদনশীল অনুমতির প্রয়োজন হয় বা এটি সংবেদনশীল ডেটা সংগ্রহ করে, তবে নিশ্চিত করুন যে এটিকে অ্যাপ্লিকেশনের ভেতরের কোড থেকে কল করা হচ্ছে এবং ব্যবহারকারীদের কাছে বিষয়টি সুস্পষ্টভাবে প্রকাশ করা হয়েছে। কোনো সংবেদনশীল অপারেশন বা ব্যবহারকারীর ডেটার জন্য জাভাস্ক্রিপ্ট ইন্টারফেস ব্যবহার করা থেকে বিরত থাকুন।
টার্গেট এপিআই লেভেল ২১ বা তার বেশি
addJavascriptInterface মেথডটি ব্যবহার করার একটি নিরাপদ উপায় হলো এপিআই লেভেল ২১ বা তার উচ্চতর সংস্করণকে টার্গেট করা, এবং তা নিশ্চিত করা যে মেথডটি শুধুমাত্র এপিআই লেভেল ২১ বা তার উচ্চতর সংস্করণে চলার সময়ই কল করা হয়। এপিআই ২১-এর আগে, জাভাস্ক্রিপ্ট একটি ইনজেক্টেড অবজেক্টের পাবলিক ফিল্ডগুলো অ্যাক্সেস করার জন্য রিফ্লেকশন ব্যবহার করতে পারত।
ঝুঁকি: মেসেজচ্যানেলের ঝুঁকি
postWebMessage() এবং postMessage() ফাংশনে উৎস নিয়ন্ত্রণের অভাবের ফলে আক্রমণকারীরা বার্তা আটক করতে বা নেটিভ হ্যান্ডলারগুলিতে বার্তা পাঠাতে সক্ষম হতে পারে।
প্রশমন
postWebMessage() বা postMessage() সেট আপ করার সময়, টার্গেট অরিজিন হিসেবে * ব্যবহার করা এড়িয়ে চলুন এবং এর পরিবর্তে প্রত্যাশিত প্রেরক ডোমেইনটি স্পষ্টভাবে উল্লেখ করুন, যাতে শুধুমাত্র বিশ্বস্ত ডোমেইন থেকে আসা মেসেজই অনুমোদিত হয়।
সম্পদ
- postMessage() ব্যবহারের সর্বোত্তম অনুশীলন
- addJavascriptInterface ডকুমেন্টেশন
- postMessage() ডকুমেন্টেশন
- WebMessagePort.postMessage() ডকুমেন্টেশন
- WebViewClient.shouldInterceptRequest ডকুমেন্টেশন
- addJavascriptInterface সংক্রান্ত নিরাপত্তা পরামর্শের নথিপত্র
- clearCache ডকুমেন্টেশন
- জাভাস্ক্রিপ্ট ডকুমেন্টেশন অপসারণ করুন
- ওয়েবভিউতে জাভাস্ক্রিপ্ট সক্রিয় করা