دسته OWASP: MASVS-PLATFORM: تعامل پلاتفرم
نمای کلی
پل بومی، که گاهیاوقات بهعنوان پل جاوا اسکریپت شناخته میشود، مکانیزمی است که
ارتباط بین «وبنما» و کد بومی Android را تسهیل میکند و بااستفاده از روش
addJavascriptInterface بهدست میآید. این کار امکان ارتباط دوطرفه بین کد جاوا اسکریپت درحال اجرا در «وبنما» و کد جاوا برنامه Android را فراهم میکند. روش addJavascriptInterface یک شیء Java را درمعرض همه قابهای «وبنما» قرار میدهد و هر قابی میتواند به نام شیء دسترسی داشته باشد و روشها را در آن فراخوانی کند. بااینحال، هیچ سازوکاری برای برنامه وجود ندارد تا
منشأ قاب فراخواننده را در «وبنما» تأیید کند، که این امر باعث ایجاد نگرانیهای
امنیتی میشود زیرا قابلاعتماد بودن محتوا نامشخص باقی میماند.
پل بومی را میتوان با کانالهای پیام HTML بااستفاده از
WebViewCompat.postWebMessage Android یا
WebMessagePort.postMessage برای برقراری ارتباط با JavaScript
Window.postMessage نیز پیادهسازی کرد. WebViewCompat.postWebMessage و
WebMessagePort.postMessage میتوانند پیامهای جاوا اسکریپت ارسالشده ازطریق
Window.postMessage را بپذیرند که در وبنما اجرا خواهد شد.
خطرات متعددی دررابطهبا پلهای بومی وجود دارد:
- پلهای مبتنی بر JavascriptInterface:
- روش
addJavascriptInterfaceیک شیء Java ارائهشده را به هر فریم «وبنما» تزریق میکند، ازجمله iframe، که یعنی دربرابر حمله اشخاص ثالث مخرب که فریمها را به وبسایت قانونی تزریق میکنند آسیبپذیر است. برنامههایی که سطح میانای برنامهسازی کاربردی ۱۶ یا قدیمیتر را هدف قرار میدهند بهطور خاص درمعرض خطر حمله قرار دارند زیرا از این روش میتوان برای اجازه دادن به JavaScript برای کنترل برنامه میزبان استفاده کرد. - انعکاس محتوای نامطمئن ارائهشده توسط کاربر در «وبنماهای» فعالشده با پل بومی امکان حملات تزریق اسکریپت ازطریق وبگاه (XSS) را فراهم میکند.
- روش
- پلهای مبتنی بر MessageChannel:
- عدم بررسی مبدأ در نقاط پایانی کانال پیام به این معنی است که پیامها از هر فرستندهای پذیرفته میشوند، ازجمله پیامهایی که حاوی کد مخرب هستند.
- ممکن است Java بهطور تصادفی درمعرض جاوا اسکریپت اختیاری قرار گیرد.
تأثیر
عوامل مخرب میتوانند از روشهای addJavascriptInterface، postWebMessage، و postMessage برای دسترسی، دستکاری، یا تزریق کدی که کنترل میکنند به «وبنما» استفاده کنند. این امر ممکن است باعث شود کاربران به سایتهای مخرب هدایت شوند،
محتوای مخرب بار کنند، یا کد مخربی در دستگاهشان اجرا شود که
میتواند دادههای حساس را استخراج کند یا به ارتقای امتیاز دست یابد.
خطر: خطرات addJavascriptInterface
«وبنما» عملکردهای اصلی مرورگر را پیادهسازی میکند، مانند رندر کردن صفحه،
پیمایش، و اجرای جاوا اسکریپت. از «وبنما» میتوان در داخل برنامه استفاده کرد
تا محتوای وب را بهعنوان بخشی از چیدمان فعالیت نمایش دهد. پیادهسازی پل بومی در «وبنما» بااستفاده از روش addJavascriptInterface میتواند مشکلات امنیتی مانند تزریق اسکریپت بینسایتی (XSS) ایجاد کند یا به مهاجمان اجازه دهد محتوای غیرقابلاعتماد را ازطریق تزریق میانجی بار کنند و برنامه میزبان را به روشهای ناخواسته دستکاری کنند و کد جاوا را با اجازههای برنامه میزبان اجرا کنند.
کاهش
غیرفعال کردن جاوا اسکریپت
در سناریوهایی که «وبنما» به جاوا اسکریپت نیاز ندارد،
setJavaScriptEnabled را در WebSettings فراخوانی نکنید (برای مثال، هنگام
نمایش محتوای HTML ایستا). بهطور پیشفرض، اجرای جاوا اسکریپت در WebView غیرفعال است.
برداشتن میانای جاوا اسکریپت هنگام بار کردن محتوای نامطمئن
مطمئن شوید که اشیا از میانای جاوا اسکریپت با فراخوانی
removeJavascriptInterface پیشاز بار شدن محتوای نامطمئن توسط
«وبنما» برداشته میشوند. برای مثال، این کار را میتوان در تماس با
shouldInterceptRequest انجام داد.
کاتلین
webView.removeJavascriptInterface("myObject")
جاوا
webView.removeJavascriptInterface("myObject");
بار کردن محتوای وب فقط ازطریق HTTPS
اگر لازم است محتوای نامطمئن بار کنید، مطمئن شوید «وبنما» محتوای وب را ازطریق اتصال رمزگذاریشده بار میکند (همچنین به رهنمودهای ما درباره ارتباطات متن ساده مراجعه کنید). با تنظیم android:usesCleartextTraffic روی false در فایل AndroidManifest، از بار شدن صفحه اولیه در اتصالات رمزگذارینشده جلوگیری کنید یا ترافیک HTTP را در پیکربندی امنیتی شبکه غیرمجاز کنید. برای اطلاعات بیشتر، به مستندات usesCleartextTraffic مراجعه کنید.
Xml
<application
android:usesCleartextTraffic="false">
<!-- Other application elements -->
</application>
برای اطمینان از اینکه تغییر مسیرها و مرور بیشتر برنامه در ترافیک رمزگذارینشده رخ نمیدهد، طرح HTTP را در loadUrl یا shouldInterceptRequest بررسی کنید:
کاتلین
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);
}
}
}
اعتبارسنجی محتوای غیرقابلاعتماد
اگر پیوندهای خارجی در «وبنما» بار میشود، هم طرح و هم میزبان را اعتبارسنجی کنید (دامنههای فهرست مجاز). هر دامنهای که در فهرست مجازها نباشد باید درعوض توسط مرورگر پیشفرض باز شود.
محتوای غیرقابلاعتماد بار نشود
درصورت امکان، فقط نشانیهای وبی که کاملاً هدفدار هستند و محتوای متعلق به توسعهدهنده برنامه در «وبنما» بار شود.
دادههای حساس را افشا نکنید
اگر برنامه شما بااستفاده از «وبنما» به دادههای حساس دسترسی پیدا میکند، پیشاز استفاده از میانای جاوا اسکریپت، از روش clearCache برای حذف فایلهای ذخیرهشده بهصورت محلی استفاده کنید. همچنین میتوانید از سرصفحههای سمت سرور، مانند no-store، استفاده کنید تا
نشان دهید که برنامه نباید محتوای خاصی را ذخیره کند.
عملکردهای حساس را افشا نکنید
اگر برنامهتان به اجازههای حساس نیاز دارد یا دادههای حساس جمعآوری میکند، مطمئن شوید که از کد درون برنامه فراخوانده میشود و شفافسازی مشهود به کاربران ارائه میشود. از میاناهای جاوا اسکریپت برای هیچیک از عملیات حساس یا دادههای کاربر استفاده نکنید.
سطح میانای برنامهسازی کاربردی هدف ۲۱ یا بالاتر
یک روش امن برای استفاده از روش addJavascriptInterface، هدفیابی سطح میانای برنامهسازی کاربردی
۲۱ یا بالاتر است، با اطمینان از اینکه این روش فقط هنگام اجرا در سطح میانای برنامهسازی کاربردی ۲۱
یا بالاتر فراخوانی میشود. قبلاز API 21، جاوا اسکریپت میتوانست از بازتاب برای دسترسی به فیلدهای عمومی
شیء تزریقشده استفاده کند.
ریسک: ریسکهای MessageChannel
فقدان کنترل مبدأ در postWebMessage() و postMessage() میتواند به مهاجمان اجازه دهد پیامها را رهگیری کنند یا به گردانندههای بومی پیام ارسال کنند.
کاهش
هنگام راهاندازی postWebMessage() یا postMessage()، فقط به پیامهای دامنههای مورداعتماد اجازه دهید و از * بهعنوان مبدأ هدف استفاده نکنید، بلکه بهجای آن، دامنه ارسالکننده موردانتظار را بهطور صریح مشخص کنید.
منابع
- روالهای مطلوب postMessage()
- مستندات addJavascriptInterface
- اسناد postMessage()
- مستندات WebMessagePort.postMessage()
- مستندات WebViewClient.shouldInterceptRequest
- مستندات توصیه امنیتی درباره addJavascriptInterface
- اسناد clearCache
- مستندات removeJavascript
- فعال کردن جاوا اسکریپت در وبنماها