阿里安全潘多拉实验室研究人员团控在BlackHat Asia上演讲
下文以安卓8终端为载体,介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。
二、正文
1. 背景
2017年下,Google发布了Android 8(奥利奥)系统。新系统在安全方面引入了多种内核安全加固特性,以对抗漏洞程序获取手机的最高权限。其中,最为重要的安全特性就是PAN(Privileged Access Never)和KASLR(Kernel AddressSpace Layout Randomization)。可见,利用一个漏洞来获取众多最新手机系统的最高权限是非常有挑战性的。
在详述内核空间镜像攻击之前,首先简单介绍ReVent通用ROOT方案。该方案基于@林雷雷(Aliaba Group)发现的一个linux内核BUG。
[1]处计算文件名的长度,并根据长度在[2]分配相应的存储buffer,在[3]拷贝文件名字符串。这个BUG在于,从[1]到[3]的代码路径上,此文件能够被重命名,导致[3]发生内核堆越界覆盖。
通过巧妙的堆布局并覆盖适合的内核对象(eg: iovs),能够将其转化为在条件竞争下,几乎任意内核地址的一次写操作。堆布局实例如下:
Android 8引入了PAN防御机制,使得内核无法直接访问用户态数据,上述绕过PXN防御机制的方法立即失效。
绝大多数的现代处理器已带有地址管理单元MMU,上述虚拟地址转换关系实际由其自动完成。ARM处理器也不例外,其通用的的地址转换关系如图所示。安卓系统采用三级页表,Level 0页表并未使用。
最后一级页表单独表示。
内存的执行属性由XN比特决定,PXN比特决定该内存的代码能否在内核态执行。而AP[2:1]两比特的组合决定了内存的读写权限。
以”0xFFFFFFC000000000″起始的1GB内核虚地址空间为例,内核Image被加载到此范围。内核代码段的访问属性是R-X,而内核数据段的访问属性是RW-。因此,一级页表描述符一定是TABLE类型。
64位内核空间的虚拟地址绝大多数是无效的,比如”[0xFFFFFFC200000000,0xFFFFFFC23FFFFFFF]”范围的地址都是无效的,其对应的一级页表项为空。假设此页表项不为空,存在一个BLOCK类型的页表项。其AP组合为’01’,output address指向第一块1GB的物理内存,如图所示。
同时,这个漏洞被Google作为有效防御的案例在zer0conf2017([Your Move: Vulnerability Exploitation and MitigationinAndroid](https://source.android.com/security/reports/zer0-conf-2017-Your-Move.pdf))上举例。关于如何100%成功率的利用这个漏洞的相关内容参看BlackHatAisa2018([KSMA: Breaking Android kernel isolation and Rooting with ARM MMUfeatures](https://www.blackhat.com/docs/asia-18/asia-18-WANG-KSMA-Breaking-Android-kernel-isolation-and-Rooting-with-ARM-MMU-features.pdf))的后部分内容。
硬件设计的不合理危害性远高于软件层面,且修补更新更为困难。在设计之初就将安全性作为一项重要的指标是最佳的选择。
值得一提的是,虽然这种攻击技巧的危害很大,不过该技巧还是有很高的技术门槛的。我们希望硬件方案商和制造商能够重视这个问题,并从硬件层面将其封堵掉。
在阿里安全潘多拉实验室,类似于团控这样的白帽黑客还有很多。这些年轻人都出生于1990年前后,他们致力于从攻击的视角去发现安全漏洞,并提出相应的解决方案,以此来提升整个安全行业的安全水位。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!