WebView – پل های بومی

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

نمای کلی

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

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

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

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

تاثیر

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

خطر: اضافه کردن خطرات رابط جاوا اسکریپت

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 مراجعه کنید.

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

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

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

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

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

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

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

عملکردهای حساس را در معرض نمایش قرار ندهید

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

سطح API 21 یا بالاتر را هدف قرار دهید

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


ریسک: خطرات کانال پیام

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

اقدامات کاهشی

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


منابع