- 任意代码执行漏洞
- 密码明文存储漏洞
- 域控制不严格漏洞
任意代码执行漏洞
漏洞产生原因:
- webview 中
addJavascriptInterface()
接口 - webview 内置导出的
searchBoxJavaBridge_
对象 - webview 内置导出的
accessibility
和accessibilityTraversal
Object 对象
- webview 中
1.addJavascriptInterface()
分析:

攻击代码示例
1
2
3
4
5
6
7
8
9
10
11
12
function execute(args){
//遍历window对象 找到包含getClass()的对象
for(var obj in window){
if("getClass" in window[obj]){
//利用反射得到Runtime对象
alert(obj);
return window[obj].getClass().forName("java.lang.Runtime")
//调用静态方法执行命令
getMethod("getRuntime",null).invoke(null,null).exec(args);
}
}
}
解决方案:
在Android 4.2版本以前,使用prompt,console.log,alert方式,这三个方法对js里是属性原生的,在android webview这一层是可以重写这三个方法的。一般我们使用prompt,因为这个在js里使用的不多,用来和native通讯副作用比较少。
2.searchBoxJavaBridge_接口引起远程代码执行漏洞
版本3.0以前webview会默认添加一个searchBoxJavaBridge_对象。
解决:删除searchBoxJavaBridge_接口 removeJavascriptInterface();
3.accessibility和 accessibilityTraversal接口引起远程代码执行漏洞
密码明文存储漏洞
1
WebSettings.setSavePassword(false)
域控制不严格漏洞
建议解决方案:
1. 对于不需要使用 file 协议的应用,禁用 file 协议; 2. 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript
1
2
3
4
5
6
7
8
9
10
11// 需要使用 file 协议
setAllowFileAccess(true);
setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
// 禁止 file 协议加载 JavaScript
if (url.startsWith("file://") {
setJavaScriptEnabled(false);
} else {
setJavaScriptEnabled(true);
}