本文源于对山东大学网络空间安全学院李蕊博士的 IEEE 论文:Android 自定义权限揭秘:从权限提升到设计缺陷 的分析,旨在学习 Android 自定义权限机制的安全风险和攻击模式。
由 InForSec 主办的“移动互联网安全”论坛上,作者对该研究进行了分享,InForSec 已上传会议视频至 Bilibili :山东大学李蕊博士:Android自定义权限机制安全性分析。
【InForSec 的会议纪要】 李蕊博士介绍了安卓中的两种权限:一种是系统权限,由系统 app 声明,保护系统资源;另一种是自定义权限,由第三方 app 声明,保护 app 资源。
以往工作对自定义权限的研究十分欠缺,李博士根据发现的自定义权限的威胁模型,将研究目标总结为:分析安卓系统中自定义权限机制的设计与实现,自动化检测其安全漏洞和设计缺陷。
李博士团队设计了自动化黑盒模糊测试工具 CuPerFuzzer ,对爬取的 17 万多个 APK 进行 Fuzz 并发现了多个 Android 系统高危的 CVE 漏洞,会议中重点分享了 CVE-2020-0148 和 CVE-2021-0317 漏洞原理与攻击效果演示。
正式开始介绍 Android 自定义权限的漏洞之前,先来简单下 Android 的权限机制。北京理工大学:Android自定义权限及其设计缺陷-陆永鑫.pdf 这篇文章里作者详细分析(感谢分享)了李蕊博士的研究论文的前世今生,本文很多材料借鉴该文,特此说明。
关于 Android 的权限机制,百度搜一下一堆文章……此处不想赘述,直接引用上面提到的北理工公开材料。
陆永鑫硕士总结了 Android 自定义权限的历史安全研究:
Tuncay 的论文获取:Resolving the Predicament of Android Custom Permissions,此处附上一篇论文解读:CustomPermission。
下面介绍下他提到的第一类漏洞—— Android 自定义权限升级(custom permission upgrade)。该漏洞使得攻击者可在未经过用户交互的情况下,直接获取 dangerous 级别的系统权限。
下图总结了该漏洞的攻击场景:
攻击步骤
漏洞原理
官方补丁
系统可以以检查其源包是否是系统应用程序的方式判断一个权限是否是系统权限。若是自定义权限,则当权限保护级别从正常或签名变为危险时,系统将保持原有的保护级别。
Tuncay 发现的第二类漏洞:confused deputy attack(混淆代理攻击)。
该漏洞可以使操作系统向攻击应用授予被攻击应用的签名级自定义权限(俩应用为不同证书签名),以此获取对被攻击应用组件的未经授权的访问。Google 承认这是高危漏洞,因为它绕过了隔离应用程序数据与其他应用程序的操作系统保护。
下图总结了该漏洞的攻击场景:
攻击步骤
漏洞原理
官方补丁
授予签名权限之前加入检查过程,这一检查确保请求签名权限的应用程序与定义此权限的应用程序由相同的证书签名。
山东大学李蕊博士及其团队认为 Tuncay 发现的 Android 系统自定义权限漏洞即为可能属于冰山一角,需要一个自动分析工具来对 Android 系统的自定义权限机制进一步进行深入探测。最终目标应该是识别存在于权限框架中的设计缺陷,而不仅仅是已成功发现的个别攻击案例。
受 Tuncay 所发现的动机案例的启发,李蕊等人将分析过程抽象为特定 APP、特定操作的执行顺序(序列),目的是寻找能触发权限升级漏洞的序列,而权限机制的内部操作可以被视作一个黑盒,设计了自动化黑盒模糊测试工具 CuPerFuzzer 。
解释下测试用例构建
应用安装,应用卸载,应用升级,系统升级,这四种操作都可能触发系统更新赋权状态:
应用升级操作的基本原理是多次安装不同版本。使用 adb 和 fastboot 控制和系统升级,使用控制多台测试实现设备并行测试。
CuPerFuzzer最终的实验成果
李蕊团队使用 4 部 Pixel 2 手机,40195 个测试案例,耗时 319.3 小时(约13.3天),平均一个测试用例执行了 114.4s。
最终,CuPerFuzzer 发现了 2,384 个测试用例触发了特权提升,包括 30 条关键路径。
最终将发现的漏洞概括为以下几类:
下面会介绍下已分配 CVE 编号的前四个漏洞的漏洞信息与原理。
该漏洞编号为 CVE-2021-0307,漏洞原理:
导致权限悬空的流程图如下所示:
漏洞攻击步骤:
步骤简单解析:
漏洞修复
当系统删除自定义权限时,它对所有 APP 的授权应该被撤销。
该漏洞的漏洞编号为 CVE-2020-0418,该漏洞可以导致应用未经用户授权的情况下,获得所有系统危险权限。
漏洞成因
Android 所有 dangerous 权限都是基于组进行管理,如果应用已经获得了某一组里的某个权限,当它请求该组里的其它权限时会被自动授权。然而,李瑞团队发现系统权限和自定义权限的权限组信息是根据不同的机制来获取的,这导致 dangerous 系统权限的《权限-权限组》映射关系存在不一致。
/system/etc/permissions
路径下的 platform.xml)来定义其《权限-权限组》 映射关系的;android.permission- group.UNDEFINED
。利用该不一致和放入 UNDEFINED 组中的 dangerous 级别的自定义权限,应用能够未经许可得到所有 dangerous 级别的系统权限。
具体的攻击场景可用下图表示:
攻击步骤解析:
WRITE_EXTERNAL_STORAGE
(外部存储空间的写权限);<uses-permission>
写入所有系统危险权限;以上操作会将所有的系统危险权限也都映射到了 UNDEFINED 权限组中,而由于 test app 已经获得WRITE_EXTERNAL_STORAGE
权限,那么其他系统危险权限自然也就都能获得。
官方补丁
官方补丁信息:CVE-2020-0418,删除了未定义权限组:android.permission-group.UNDEFINED
。
该漏洞编号为:CVE-2021-0306,它可以使得恶意 app 可以在进行 Android 系统版本升级过程中无需用户同意,直接获得高版本操作系统新增的危险权限的能力。
漏洞成因
相比于 Tuncay 在 2018 年发现的自定义权限升级漏洞(本文1.2章节),李蕊发现 Android 官方虽然修复了在应用升级过程中权限定义不一致导致的权限提升问题,但是 Android OS 升级过程中也存在自定义权限定义不一致导致权限提升的漏洞!!
需要注意的是,如果权限的当前所有者不是系统,则该权限将被覆盖。
漏洞利用
android.permission.ACTIVITY_RECOGNITION
运行时权限(Dangerous 级别),不同的是 app-ds3 将其定义为 normal 级别;漏洞修复
在 Android OS 更新时,如果权限的当前所有者不是系统,对应权限的授权应该被撤销。
该漏洞的编号为 CVE-2021-0317,该漏洞会导致恶意 app 在可以通过安装包升级修改自定义权限后(将 normal 提升为 dangerous 并加入 phone 权限组),当用户重启设备后即可在用户无感知的情况下获得 phone 权限组的能力。
漏洞原理
同样相比于 Tuncay 在 2018 年发现的自定义权限升级漏洞(本文1.2章节),李蕊发现 Android 官方虽然修复了在应用升级过程中权限定义不一致导致的权限提升问题,但是 Android OS 升级过程或设备重启过程中也存在自定义权限定义不一致导致权限提升的漏洞!!
同时不同于 2.4 章节所提到的漏洞的是,CVE-2021-0317 漏洞是用户完全自定义的新权限,而不是 Android OS 升级后高版本的操作系统会存在的权限。
攻击步骤
<uses-permission>
申请使用 com.test.cp 权限与 CALL_PHONE 权限(需要动态授权,安装后不会被自动授予);漏洞修复
当权限定义更新,APP 对应权限的授权应该被撤销。
针对发现的缺陷,李博士团队提出了3种通用的安全设计准则:
该论文和研究带来的个人启示:
本文参考文章与相关材料: