type
status
date
slug
summary
tags
category
icon
password
漏洞说明
LaunchAnyWhere
顾名思义就是能够掉起任意未导出的Activity,突破进程间组件访问隔离的限制。这个漏洞影响2.3 ~ 4.3
的安卓系统。Android4.4
该漏洞被修复:Diff - 5bab9da^! - platform/frameworks/base - Git at Google即在AppB返回
Bundle
给AppA时检查其中的Intent
指向组件的签名是否与AppB签名一致。这也就导致不能再从AppA通过Intent跳转到其他的组件,尤其是即使AppA为systemApp,也无法实现无视组件是否导出而进行跳转,现在只能跳转到AppB中的组件。在
Android8.0.0
中引入checkKeyIntent
用于检查Intent在
Android8.0.0-r35
中在checkKeyIntent
开头加入Flag的设置intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION));
即如果传输的数据中含有Intent数据,将有关
ContentProvider
授权的标志位全部置为不允许,在一定程度上避免了将部分敏感的provider
的操作权限授权给其他APP。但是实际上在
execStartActivity
中包含了intent.migrateExtraStreamToClipData();
这样一个处理在Android中,
migrateExtraStreamToClipData
是一个内部方法,用于处理Intent
中的EXTRA_STREAM
数据。这个方法会将EXTRA_STREAM
中的数据迁移到ClipData
中,以便可以通过剪贴板框架进行分享。这个方法主要在处理
ACTION_SEND
和ACTION_SEND_MULTIPLE
这两种Intent时使用,这两种Intent通常用于分享数据。当这些Intent包含EXTRA_STREAM
数据时,migrateExtraStreamToClipData
方法会被调用,以将数据迁移到ClipData
中。在处理这两种Intent
时会通过addFlags
添加provider
授权的flags
。并且可以发现如果是isImageCaptureIntent
,将会同时添加provider
读写授权,这就相当于前面将两个flags
置为不允许的做法失效了,从而能够使得不需要构造Bundle
风水也能成功将provider
外带并授权读写。漏洞利用
漏洞影响:
Android 9 10
先给出官方poc中关于该漏洞的利用,可以看到时通过将
Action
设置为Intent.ACTION_SEND_MULTIPLE
可以外带provider
并且授权读权限。再参考路师傅博客,直接
MediaStore.ACTION_IMAGE_CAPTURE
设置为Action,同时获得读写权限的授权。漏洞修复
如果getClipData为null则手动设置一个ClipData,这将会导致
migrateExtraStreamToClipData
中getClipData() != null
的条件不满足,从而无法走到后续的漏洞点。没想到除了
Bundle风水
还有这样一种优雅的利用方法,叹为观止参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/CVE-2020-0338
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章