WebView – پل های بومی

دسته OWASP: MASVS-PLATFORM: تعامل پلتفرم

نمای کلی

یک پل بومی، که گاهی اوقات به عنوان یک پل جاوا اسکریپت شناخته می‌شود، مکانیزمی است که ارتباط بین یک WebView و کد بومی اندروید را تسهیل می‌کند، که با استفاده از متد addJavascriptInterface حاصل می‌شود. این امر امکان ارتباط دو طرفه بین کد جاوا اسکریپت در حال اجرا در WebView و کد جاوای برنامه اندروید را فراهم می‌کند. متد addJavascriptInterface یک شیء جاوا را در معرض تمام فریم‌های یک WebView قرار می‌دهد و هر فریم می‌تواند به نام شیء و متدهای فراخوانی روی آن دسترسی داشته باشد. با این حال، هیچ مکانیزمی برای برنامه وجود ندارد که مبدا فریم فراخوانی را در WebView تأیید کند، که نگرانی‌های امنیتی را ایجاد می‌کند زیرا اعتبار محتوا نامشخص است.

یک پل بومی همچنین می‌تواند با کانال‌های پیام HTML با استفاده از WebViewCompat.postWebMessage یا WebMessagePort.postMessage اندروید برای ارتباط با Window.postMessage جاوا اسکریپت پیاده‌سازی شود. WebViewCompat.postWebMessage و WebMessagePort.postMessage می‌توانند پیام‌های جاوا اسکریپت ارسال شده از طریق Window.postMessage را که درون WebView اجرا می‌شوند، بپذیرند.

خطرات متعددی در ارتباط با پل‌های بومی وجود دارد:

  • پل‌های مبتنی بر رابط کاربری جاوااسکریپت:
    • متد addJavascriptInterface یک شیء جاوای ارائه شده را به هر فریم از WebView، از جمله iframeها، تزریق می‌کند، به این معنی که مستعد حمله توسط اشخاص ثالث مخرب است که فریم‌ها را به یک وب‌سایت قانونی تزریق می‌کنند. برنامه‌هایی که API سطح ۱۶ یا قبل از آن را هدف قرار می‌دهند، به ویژه در معرض خطر حمله هستند زیرا این روش می‌تواند برای کنترل برنامه میزبان توسط جاوا اسکریپت استفاده شود.
    • انعکاس محتوای غیرقابل اعتماد ارائه شده توسط کاربر در WebViewهای بومیِ دارای پل، امکان حملات اسکریپت نویسی بین سایتی (XSS) را فراهم می‌کند.
  • پل‌های مبتنی بر کانال پیام:
    • عدم بررسی مبدا در نقاط پایانی کانال پیام به این معنی است که پیام‌ها از هر فرستنده‌ای، از جمله آنهایی که حاوی کد مخرب هستند، پذیرفته می‌شوند.
    • ممکن است جاوا به طور تصادفی در معرض جاوا اسکریپت دلخواه قرار گیرد.

تأثیر

متدهای addJavascriptInterface ، postWebMessage و postMessage می‌توانند توسط عوامل مخرب برای دسترسی، دستکاری یا تزریق کدی که کنترل می‌کنند به یک WebView مورد استفاده قرار گیرند. این ممکن است منجر به هدایت کاربران به سایت‌های مخرب، بارگیری محتوای مخرب یا اجرای کد مخرب روی دستگاه‌های آنها شود که می‌تواند داده‌های حساس را استخراج کند یا به افزایش امتیاز دست یابد.

ریسک: خطرات addJavascriptInterface

WebView قابلیت‌های اساسی یک مرورگر، مانند رندر صفحه، ناوبری و اجرای جاوا اسکریپت را پیاده‌سازی می‌کند. WebView می‌تواند در داخل یک برنامه برای نمایش محتوای وب به عنوان بخشی از طرح‌بندی فعالیت استفاده شود. پیاده‌سازی یک پل بومی در یک WebView با استفاده از روش addJavascriptInterface می‌تواند مشکلات امنیتی مانند اسکریپت‌نویسی بین سایتی (XSS) ایجاد کند، یا به مهاجمان اجازه دهد محتوای غیرقابل اعتماد را از طریق تزریق رابط بارگذاری کنند و برنامه میزبان را به روش‌های ناخواسته دستکاری کنند و کد جاوا را با مجوزهای برنامه میزبان اجرا کنند.

کاهش‌ها

غیرفعال کردن جاوا اسکریپت

در سناریوهایی که WebView به جاوا اسکریپت نیاز ندارد، تابع setJavaScriptEnabled در WebSettings فراخوانی نکنید (برای مثال، هنگام نمایش محتوای HTML استاتیک). به طور پیش‌فرض، اجرای جاوا اسکریپت در WebView غیرفعال است.

هنگام بارگیری محتوای غیرقابل اعتماد، رابط جاوا اسکریپت را حذف کنید

با فراخوانی removeJavascriptInterface قبل از بارگذاری محتوای نامعتبر توسط WebView، از حذف اشیاء از رابط جاوا اسکریپت اطمینان حاصل کنید. برای مثال، این کار را می‌توان با فراخوانی shouldInterceptRequest انجام داد.

کاتلین

webView.removeJavascriptInterface("myObject")

جاوا

webView.removeJavascriptInterface("myObject");

فقط محتوای وب را از طریق HTTPS بارگیری کنید

اگر نیاز به بارگذاری محتوای غیرقابل اعتماد دارید، مطمئن شوید که WebView محتوای وب را از طریق یک اتصال رمزگذاری شده بارگذاری می‌کند (همچنین به دستورالعمل‌های ما در مورد Cleartext Communications مراجعه کنید). با تنظیم android:usesCleartextTraffic روی false در فایل AndroidManifest یا عدم اجازه ترافیک HTTP در پیکربندی امنیت شبکه ، از بارگذاری اولیه صفحه در اتصالات رمزگذاری نشده جلوگیری کنید. برای اطلاعات بیشتر به مستندات usesCleartextTraffic مراجعه کنید.

ایکس ام ال

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

اعتبارسنجی محتوای غیرقابل اعتماد

اگر لینک‌های خارجی در یک WebView بارگذاری شده‌اند، هم scheme و هم host (دامنه‌های allowlist) را اعتبارسنجی کنید. هر دامنه‌ای که در allowlist نباشد، باید توسط مرورگر پیش‌فرض باز شود.

محتوای غیرقابل اعتماد را بارگیری نکنید

در صورت امکان، فقط URL های کاملاً محدود و محتوای متعلق به توسعه دهنده برنامه را در WebView بارگذاری کنید.

داده‌های حساس را افشا نکنید

اگر برنامه شما با استفاده از WebView به داده‌های حساس دسترسی پیدا می‌کند، قبل از استفاده از رابط جاوا اسکریپت، استفاده از متد clearCache را برای حذف هرگونه فایل ذخیره شده به صورت محلی در نظر بگیرید. همچنین می‌توانید از هدرهای سمت سرور، مانند no-store، برای نشان دادن اینکه یک برنامه نباید محتوای خاصی را ذخیره کند، استفاده کنید.

قابلیت‌های حساس را در معرض نمایش قرار ندهید

اگر برنامه شما به مجوزهای حساس نیاز دارد یا داده‌های حساسی را جمع‌آوری می‌کند، مطمئن شوید که از طریق کد درون برنامه فراخوانی می‌شود و افشای اطلاعات به کاربران ارائه می‌شود. از استفاده از رابط‌های جاوا اسکریپت برای هرگونه عملیات حساس یا داده‌های کاربر خودداری کنید.

سطح API هدف ۲۱ یا بالاتر

یک راه امن برای استفاده از متد addJavascriptInterface این است که API سطح ۲۱ یا بالاتر را هدف قرار دهید، به این صورت که مطمئن شوید این متد فقط هنگام اجرا روی API سطح ۲۱ یا بالاتر فراخوانی می‌شود. قبل از API 21، جاوا اسکریپت می‌توانست از reflection برای دسترسی به فیلدهای عمومی یک شیء تزریق شده استفاده کند.


ریسک: ریسک‌های کانال پیام

فقدان کنترل مبدا در postWebMessage() و postMessage() می‌تواند به مهاجمان اجازه دهد پیام‌ها را رهگیری کنند یا به کنترل‌کننده‌های بومی پیام ارسال کنند.

کاهش‌ها

هنگام تنظیم postWebMessage() یا postMessage() ، فقط پیام‌های دریافتی از دامنه‌های قابل اعتماد را مجاز کنید و از استفاده از * به عنوان مبدا هدف خودداری کنید و در عوض، دامنه ارسال مورد انتظار را به صراحت مشخص کنید.


منابع