开发中有使用到WebView,使用过程中遇到一些比较坑的问题。这里总结一下,便于回头看,少走弯路。
说到WebView,这就牵扯到android 和 javascript的交互。
webSettings.setJavaScriptEnabled(true); //设置webview支持js
WebView使用中主要有三种漏洞:
任意代码执行漏洞
密码明文存储漏洞
域控制不严格漏洞
具体分析:
1.1 WebView 任意代码执行漏洞
出现该漏洞的原因有三个:
- WebView 中 addJavascriptInterface接口
- WebView 内置导出的 searchBoxJavaBridge_对象
- WebView 内置导出的accessibility 和 accessibilityTraversalObject 对象
1.11 addJavascriptInterface 接口引起远程代码执行漏洞
A. 漏洞产生原因—–
:::::::::::::::
》》JS调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射,所以,漏洞产生原因是:当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(Java.lang.Runtime 类),从而进行任意代码执行。比如:可以执行命令获取本地设备的SD卡中的文件等信息从而造成信息泄露等。
:::::::::::::
B. 解决方案 ——
:::::::::::::
》》android 4.2版本以后在本地方法上加@JavascriptInterface注解以避免漏洞攻击
》》android 4.2版本以前采用拦截prompt()进行漏洞修复。1.12 searchBoxJavaBridge_接口引起远程代码执行漏洞
A. 漏洞产生原因—–
:::::::::::
》》在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象:searchBoxJavaBridge_对象。该接口可能被利用,实现远程任意代码。
:::::::::::
B. 解决方案——
》》删除searchBoxJavaBridge_接口。
(通过调用该方法删除接口-removeJavascriptInterface() );
:::::::::::1.13 accessibility和 accessibilityTraversal接口引起远程代码执行漏洞
::::A. 漏洞产生原因
::::
》》 在Android 3.0以下,Android系统会默认通过accessibility 和 accessibilityTraversal的Js接口给 WebView 添加一个JS映射对象:accessibility对象 和 accessibilityTraversal对象。该接口可能被利用,实现远程任意代码。
:::
B. 解决方案
》》删除接口
1.2 密码明文存储漏洞
WebView默认开启密码保存功能 :mWebSettings.setSavePassword(true)
- 开启后,在用户输入密码时,会弹出提示框:询问用户是否保存密码;
- 如果选择”是”,密码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取密码的危险。
解决方案:
》》关闭密码保存提醒:mWebSettings.setSavePassword(false)
1.3 域控制不严格漏洞
- webView.getSettings().setAllowFileAccess(false); // 设置是否允许 WebView 使用 File 协议
- webView.getSettings().setAllowFileAccessFromFileURLs(true); // 设置是否允许通过 file url 加载的 Js代码读取其他的本地文件
- webView.getSettings().setAllowUniversalAccessFromFileURLs(true); // 设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
一句话说明就是:使用 file 域加载的 js代码能够使用进行同源策略跨域访问,从而导致隐私信息泄露。
- 最终解决方案:
- 对于不需要使用 file 协议的应用,禁用 file 协议;
// 禁用 file 协议;
setAllowFileAccess(false);
setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
::::::::::::::::- 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。
// 需要使用 file 协议
setAllowFileAccess(true);
setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
::::::::::::::::
// 禁止 file 协议加载 JavaScript
if (url.startsWith("file://") {
setJavaScriptEnabled(false);
} else {
setJavaScriptEnabled(true);
}