OWASP বিভাগ: MASVS-প্ল্যাটফর্ম: প্ল্যাটফর্ম ইন্টারঅ্যাকশন
ওভারভিউ
একটি নেটিভ ব্রিজ, যা কখনও কখনও জাভাস্ক্রিপ্ট ব্রিজ নামে পরিচিত, একটি মেকানিজম যা একটি ওয়েবভিউ এবং নেটিভ অ্যান্ড্রয়েড কোডের মধ্যে যোগাযোগ সহজতর করে, addJavascriptInterface
পদ্ধতি ব্যবহার করে অর্জন করা হয়। এটি ওয়েবভিউতে চলমান জাভাস্ক্রিপ্ট কোড এবং অ্যান্ড্রয়েড অ্যাপ্লিকেশনের জাভা কোডের মধ্যে দ্বিমুখী যোগাযোগের অনুমতি দেয়। addJavascriptInterface
পদ্ধতিটি একটি জাভা অবজেক্টকে ওয়েবভিউ-এর সমস্ত ফ্রেমে প্রকাশ করে এবং যে কোনও ফ্রেম এটিতে অবজেক্টের নাম এবং কল পদ্ধতিগুলি অ্যাক্সেস করতে পারে। যাইহোক, ওয়েবভিউ-এর মধ্যে কলিং ফ্রেমের উৎপত্তি যাচাই করার জন্য অ্যাপ্লিকেশনটির কোন ব্যবস্থা নেই, যা নিরাপত্তার উদ্বেগ বাড়ায় কারণ বিষয়বস্তুর বিশ্বাসযোগ্যতা অনিশ্চিত থাকে।
জাভাস্ক্রিপ্ট Window.postMessage
এর সাথে যোগাযোগ করার জন্য Android এর WebViewCompat.postWebMessage
বা WebMessagePort.postMessage
ব্যবহার করে HTML বার্তা চ্যানেলগুলির সাথে একটি নেটিভ ব্রিজও প্রয়োগ করা যেতে পারে। WebViewCompat.postWebMessage
এবং WebMessagePort.postMessage
Window.postMessage
এর মাধ্যমে প্রেরিত জাভাস্ক্রিপ্ট বার্তাগুলি গ্রহণ করতে পারে যা WebView এর মধ্যে কার্যকর করা হবে৷
স্থানীয় সেতুগুলির সাথে যুক্ত একাধিক ঝুঁকি রয়েছে:
- জাভাস্ক্রিপ্ট ইন্টারফেস-ভিত্তিক সেতু:
-
addJavascriptInterface
পদ্ধতিটি iframes সহ WebView এর প্রতিটি ফ্রেমে একটি সরবরাহকৃত জাভা অবজেক্টকে ইনজেকশন করে, যার মানে এটি একটি বৈধ ওয়েবসাইটে ফ্রেম ইনজেকশনের ক্ষতিকারক তৃতীয় পক্ষের দ্বারা আক্রমণের জন্য সংবেদনশীল। এপিআই লেভেল 16 বা তার আগের অ্যাপ্লিকেশানগুলিকে লক্ষ্য করে বিশেষভাবে আক্রমণের ঝুঁকিতে রয়েছে কারণ এই পদ্ধতিটি জাভাস্ক্রিপ্টকে হোস্ট অ্যাপ্লিকেশানকে নিয়ন্ত্রণ করার অনুমতি দেওয়ার জন্য ব্যবহার করা যেতে পারে। - স্থানীয় ব্রিজ-সক্ষম WebViews-এ অবিশ্বস্ত ব্যবহারকারী-প্রদত্ত বিষয়বস্তু প্রতিফলিত করা ক্রস-সাইট স্ক্রিপ্টিং (XSS) আক্রমণের অনুমতি দেয়।
-
- মেসেজচ্যানেল-ভিত্তিক ব্রিজ:
- বার্তা চ্যানেল এন্ডপয়েন্টে মূল চেকের অভাবের অর্থ হল যে কোনও প্রেরকের কাছ থেকে বার্তাগুলি গ্রহণ করা হবে, যার মধ্যে দূষিত কোড রয়েছে৷
- ঘটনাক্রমে জাভাকে নির্বিচারে জাভাস্ক্রিপ্টের সাথে প্রকাশ করা সম্ভব।
প্রভাব
addJavascriptInterface
, postWebMessage
, এবং postMessage
পদ্ধতিগুলি ক্ষতিকারক অভিনেতাদের দ্বারা একটি ওয়েবভিউতে নিয়ন্ত্রণ করা কোড অ্যাক্সেস, ম্যানিপুলেট বা ইনজেক্ট করার জন্য ব্যবহার করা যেতে পারে৷ এটি ব্যবহারকারীদের দূষিত সাইটগুলিতে পুনঃনির্দেশিত হতে পারে, ক্ষতিকারক সামগ্রী লোড করতে পারে বা তাদের ডিভাইসে দূষিত কোড চালানো হতে পারে যা সংবেদনশীল ডেটা বের করতে পারে বা বিশেষাধিকার বৃদ্ধি পেতে পারে।
ঝুঁকি: অ্যাডজাভাস্ক্রিপ্ট ইন্টারফেস ঝুঁকি
WebView একটি ব্রাউজারের মৌলিক কার্যকারিতা প্রয়োগ করে, যেমন পেজ রেন্ডারিং, নেভিগেশন এবং জাভাস্ক্রিপ্ট এক্সিকিউশন। একটি অ্যাক্টিভিটি লেআউটের অংশ হিসেবে ওয়েব কন্টেন্ট প্রদর্শন করতে একটি অ্যাপ্লিকেশনের ভিতরে WebView ব্যবহার করা যেতে পারে। addJavascriptInterface
পদ্ধতি ব্যবহার করে একটি ওয়েবভিউয়ের মধ্যে একটি নেটিভ ব্রিজ প্রয়োগ করা নিরাপত্তা সমস্যা তৈরি করতে পারে যেমন ক্রস-সাইট স্ক্রিপ্টিং (এক্সএসএস), অথবা আক্রমণকারীদের ইন্টারফেস ইনজেকশনের মাধ্যমে অবিশ্বস্ত বিষয়বস্তু লোড করতে এবং অনাকাঙ্ক্ষিত উপায়ে হোস্ট অ্যাপ্লিকেশনটিকে ম্যানিপুলেট করার অনুমতি দেয়, অনুমতির সাথে জাভা কোড কার্যকর করে। হোস্ট অ্যাপ্লিকেশনের।
প্রশমন
জাভাস্ক্রিপ্ট অক্ষম করুন
যেসব পরিস্থিতিতে WebView-এর জন্য JavaScript প্রয়োজন হয় না, সেখানে WebSettings
মধ্যে (উদাহরণস্বরূপ, স্ট্যাটিক এইচটিএমএল কন্টেন্ট প্রদর্শন করার সময়) setJavaScriptEnabled
কল করবেন না। ডিফল্টরূপে, WebView-এ JavaScript এক্সিকিউশন অক্ষম করা আছে।
অবিশ্বস্ত সামগ্রী লোড করার সময় JavaScript ইন্টারফেস সরান
WebView দ্বারা অবিশ্বস্ত বিষয়বস্তু লোড হওয়ার আগে JavaScript ইন্টারফেস থেকে অবজেক্টগুলি সরিয়ে ফেলা removeJavascriptInterface
ইন্টারফেস কল করে নিশ্চিত করুন৷ উদাহরণস্বরূপ, এটি shouldInterceptRequest
এ একটি কলে করা যেতে পারে।
কোটলিন
webView.removeJavascriptInterface("myObject")
জাভা
webView.removeJavascriptInterface("myObject");
শুধুমাত্র HTTPS এর মাধ্যমে ওয়েব কন্টেন্ট লোড করুন
আপনার যদি অবিশ্বস্ত সামগ্রী লোড করার প্রয়োজন হয়, WebView একটি এনক্রিপ্ট করা সংযোগের মাধ্যমে ওয়েব সামগ্রী লোড করে তা নিশ্চিত করুন (এছাড়াও Cleartext Communications এ আমাদের নির্দেশিকা দেখুন)। AndroidManifest
ফাইলে android:usesCleartextTraffic
কে false
সেট করে বা নেটওয়ার্ক সিকিউরিটি কনফিগারেশনে HTTP ট্র্যাফিকের অনুমতি না দিয়ে এনক্রিপ্ট করা সংযোগে প্রাথমিক পৃষ্ঠা লোড হওয়া থেকে বিরত রাখুন। আরও তথ্যের জন্য CleartextTraffic ডকুমেন্টেশন 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);
}
}
}
অবিশ্বস্ত বিষয়বস্তু যাচাই
ওয়েবভিউতে যদি কোনও বাহ্যিক লিঙ্ক লোড করা হয়, তাহলে স্কিম এবং হোস্ট (অনুমোদিত ডোমেন) উভয়ই যাচাই করুন। অনুমতি তালিকায় না থাকা যেকোনো ডোমেন ডিফল্ট ব্রাউজার দিয়ে খোলা উচিত।
অবিশ্বস্ত কন্টেন্ট লোড করবেন না
যদি সম্ভব হয়, শুধুমাত্র কঠোরভাবে ব্যাপ্ত URL এবং অ্যাপ ডেভেলপারের মালিকানাধীন বিষয়বস্তু WebView-এ লোড করুন।
সংবেদনশীল তথ্য প্রকাশ করবেন না
যদি আপনার অ্যাপ্লিকেশন একটি WebView এর মাধ্যমে সংবেদনশীল ডেটা অ্যাক্সেস করে, তাহলে JavaScript ইন্টারফেস ব্যবহার করার আগে স্থানীয়ভাবে সংরক্ষিত কোনো ফাইল মুছে ফেলার জন্য clearCache
পদ্ধতি ব্যবহার করার কথা বিবেচনা করুন। আপনি সার্ভার-সাইড হেডারগুলিও ব্যবহার করতে পারেন, যেমন নো-স্টোর, নির্দেশ করতে যে একটি অ্যাপ্লিকেশন নির্দিষ্ট সামগ্রী ক্যাশে করা উচিত নয়৷
সংবেদনশীল কার্যকারিতা প্রকাশ করবেন না
আপনার অ্যাপ্লিকেশানের যদি সংবেদনশীল অনুমতির প্রয়োজন হয় বা সংবেদনশীল ডেটা সংগ্রহ করা হয়, তবে নিশ্চিত করুন যে এটিকে অ্যাপ্লিকেশনের মধ্যে কোড থেকে কল করা হয়েছে এবং ব্যবহারকারীদের কাছে বিশিষ্ট প্রকাশ প্রদান করা হয়েছে। কোনো সংবেদনশীল অপারেশন বা ব্যবহারকারীর ডেটার জন্য জাভাস্ক্রিপ্ট ইন্টারফেস ব্যবহার করা এড়িয়ে চলুন।
টার্গেট এপিআই লেভেল 21 বা তার বেশি
addJavascriptInterface
পদ্ধতি ব্যবহার করার একটি নিরাপদ উপায় হল API স্তর 21 বা উচ্চতর টার্গেট করা নিশ্চিত করে পদ্ধতিটি শুধুমাত্র যখন API স্তর 21 বা উচ্চতরে চলছে তখনই কল করা হয়। API 21 এর আগে, জাভাস্ক্রিপ্ট একটি ইনজেক্ট করা বস্তুর সর্বজনীন ক্ষেত্রগুলি অ্যাক্সেস করতে প্রতিফলন ব্যবহার করতে পারে।
ঝুঁকি: MessageChannel ঝুঁকি
postWebMessage()
এবং postMessage()
এ উৎপত্তি নিয়ন্ত্রণের অভাব আক্রমণকারীদের বার্তা আটকাতে বা নেটিভ হ্যান্ডলারদের কাছে বার্তা পাঠাতে দেয়।
প্রশমন
postWebMessage()
বা postMessage()
সেট আপ করার সময়, শুধুমাত্র বিশ্বস্ত ডোমেন থেকে বার্তাগুলিকে লক্ষ্যের উত্স হিসাবে * ব্যবহার এড়িয়ে যাওয়ার অনুমতি দিন এবং এর পরিবর্তে প্রত্যাশিত পাঠানো ডোমেনটি স্পষ্টভাবে নির্দিষ্ট করুন৷
সম্পদ
- postMessage() সেরা অনুশীলন
- অ্যাডজাভাস্ক্রিপ্ট ইন্টারফেস ডকুমেন্টেশন
- postMessage() ডকুমেন্টেশন
- WebMessagePort.postMessage() ডকুমেন্টেশন
- WebViewClient.shouldInterceptRequest ডকুমেন্টেশন
- অ্যাডজাভাস্ক্রিপ্ট ইন্টারফেস সম্পর্কিত নিরাপত্তা পরামর্শের ডকুমেন্টেশন
- সাফ ক্যাশে ডকুমেন্টেশন
- জাভাস্ক্রিপ্ট ডকুমেন্টেশন সরান
- ওয়েবভিউতে জাভাস্ক্রিপ্ট সক্রিয় করা হচ্ছে