目录
WebView组件远程代码执行漏洞
addJavascriptInterface接口
Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法,简单的说就是通过addJavascriptInterface给WebView加入一个JavaScript桥接接口,JavaScript通过调用这个接口可以直接操作本地的JAVA接口。
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");
我们向WebView注册一个名叫“jsInterface”的对象,然后在JS中可以访问到jsInterface这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互。
JS中可以遍历window对象,找到存在“getClass”方法的对象的对象,然后再通过反射的机制,得到Runtime对象,然后调用静态方法来执行一些命令。
核心代码如下:
function execute(cmdArgs)
{
for (var obj in window) {
if ("getClass" in window[obj]) {
alert(obj);
return window[obj].getClass().forName("java.lang.Runtime")
.getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
}
}
解决方案
- Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击
- Android 4.2版本之前采用拦截
prompt()
进行漏洞修复。 详见
searchBoxJavaBridge_接口
在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象:searchBoxJavaBridge_对象。
解决方案
删除默认添加的"searchBoxJavaBridge_"。
mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
accessibility 和 accessibilityTraversal
此漏洞原理与searchBoxJavaBridge_接口远程代码执行相似,均为未移除不安全的默认接口,不过此漏洞需要用户启动系统设置中的第三方辅助服务,利用条件较复杂。
解决方案
与searchBoxJavaBridge_的解决方案类似:可以调用removeJavascriptInterface(“accessibility”) 和removeJavascriptInterface(“accessibilityTraversal”) 方法移除这两个默认接口。
WebView跨域访问漏洞
如果一个Activity可以被其他应用调起,例如声明了android:exported="true"
,相关WebView又开启了file域访问,同时未对file 域的路径进行严格限制所致。攻击者通过URL Scheme 的方式,可远程打开并加载恶意HTML文件,远程获取APP中包括用户登录凭证在内的所有本地敏感数据。
涉及到三个方法:
-
setAllowFileAccess
设置是否允许WebView使用File协议,默认设置为true,即允许在File域下执行任意JavaScript代码。
-
setAllowFileAccessFromFileURLs
设置是否允许通过 file url 加载的 Js代码读取其他的本地文件。
-
setAllowUniversalAccessFromFileURLs
设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)。
解决方案
1.file域访问为非功能需求时,手动配置setAllowFileAccessFromFileURLs或setAllowUniversalAccessFromFileURLs两个API为false。(Android4.1版本之前这两个API默认是true,需要显式设置为false)
2.若需要开启file域访问,则设置file路径的白名单,严格控制file域的访问范围,具体如下:
(1)固定不变的HTML文件可以放在assets或res目录下,file:///android_asset
和file:///android_res
在不开启API的情况下也可以访问;
(2)可能会更新的HTML文件放在/data/data/(app)
目录下,避免被第三方替换或修改;
(3)对file域请求做白名单限制时,需要对“…/…/”特殊情况进行处理,避免白名单被绕过。
3.避免App内部的WebView被不信任的第三方调用。排查内置WebView的 Activity是否被导出、必须导出的Activity是否会通过参数传递调起内置的WebView等。
4.建议进一步对APP目录下的敏感数据进行保护。客户端APP应用设备相关信息(如IMEI、IMSI、Android_id等)作为密钥对敏感数据进行加密。使攻击者难以利用相关漏洞获得敏感信息。
WebView组件忽略SSL证书验证错误漏洞
Android WebView组件加载网页发生证书认证错误时