首页
社区
课程
招聘
[推荐]阿里90后工程师利用ARM MMU硬件特性开启安卓8终端的上帝模式
发表于: 2018-6-13 15:22 10670

[推荐]阿里90后工程师利用ARM MMU硬件特性开启安卓8终端的上帝模式

2018-6-13 15:22
10670

文/图阿里安全潘多拉实验室 团控


编者按:团控,阿里安全潘多拉实验室研究人员,该实验室主要聚焦于移动安全领域,包括对iOS和Android系统安全的攻击和防御技术研究。团控的主攻方向为安卓系统级漏洞的攻防研究。在今年3月的BlackHat Asia和4月份的HITB上,团控受邀做了主题为《内核空间镜像攻击》的演讲。

以下为团控该研究主题的技术分析文章。


一、前言

在现代操作系统中,系统运行的内核空间和应用程序的用户空间相互隔离,以保证操作系统的稳定性。以运行Linux内核的ARM终端为例,内核空间和用户空间拥有不同的页表信息,并保存于不同的硬件寄存器。另外,内核运行时的特权等级高于用户态程序,无论何时内核空间对普通程序是不可见的。然而,ARM处理器的某些特殊硬件特性能够打破这种保护,使得普通程序在用户态能够直接访问内核空间,直接打破内核空间与用户空间的隔离,修改内核代码,开启上帝模式。下文以安卓8终端为载体,介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。


二、正文

1. 背景

2017年下,Google发布了Android 8(奥利奥)系统。新系统在安全方面引入了多种内核安全加固特性,以对抗漏洞程序获取手机的最高权限。其中,最为重要的安全特性就是PAN(Privileged Access Never)和KASLR(Kernel Address Space Layout Randomization)。可见,利用一个漏洞来获取众多最新手机系统的最高权限是非常有挑战性的。

在详述内核空间镜像攻击之前,首先简单介绍ReVent通用ROOT方案。该方案基于@林雷雷(Aliaba Group)发现的一个linux内核BUG。

这个BUG存在与notification内核系统调用:

[1]处计算文件名的长度,并根据长度在[2]分配相应的存储buffer,在[3]拷贝文件名字符串。这个BUG在于,从[1]到[3]的代码路径上,此文件能够被重命名,导致[3]发生内核堆越界覆盖。

通过巧妙的堆布局并覆盖适合的内核对象(eg: iovs),能够将其转化为在条件竞争下,几乎任意内核地址的一次写操作。堆布局实例如下:

为了向普通应用程序提供服务,用户程序的地址空间对操作系统内核是可见的。为了防止内核直接执行用户程序提供的恶意代码,早些年ARM处理器就引入了PXN(Privileged Execute Never)安全特性来缓解漏洞利用。虽然内核不能直接执行用户态代码,但可以直接访问用户态数据。利用一次写内核地址的机会,劫持内核数据指针。在Android 7及以下的安卓终端上,一种常见的绕过PXN防御机制的方法如图所示。

Android 8引入了PAN防御机制,使得内核无法直接访问用户态数据,上述绕过PXN防御机制的方法立即失效。

虽然多次触发上述条件竞争漏洞将payload数据写入内核可以用于绕过PAN,但exploit代码执行成功率急剧下降。另外,借助其他内核漏洞(eg: CVE-2017-13164)可以将数据稳定写入内核,但在漏洞急剧减少的情况下,能否通过新的利用技巧同时绕过PXN和PAN防御机制,并获取系统最高权限?借助ARM处理器的MMU硬件特性,答案是肯定的。


2. 内核空间镜像攻击

Linux内核经典的三级页表(PGD\PMD\PTE)布局和遍历关系如下图所示。

绝大多数的现代处理器已带有地址管理单元MMU,上述虚拟地址转换关系实际由其自动完成。ARM处理器也不例外,其通用的的地址转换关系如图所示。安卓系统采用三级页表,Level 0页表并未使用。

各级页表中的描述符不仅包含了下一级起始物理地址,还包含了对这段内存的访问属性。ARM有两种描述符block和table。

最后一级页表单独表示。

上述页表描述符中output address保存物理地址,两端比特位保存内存属性信息。

内存的执行属性由XN比特决定,PXN比特决定该内存的代码能否在内核态执行。而AP[2:1]两比特的组合决定了内存的读写权限。

其中,'01'组合比较奇怪。按照此种设计,该内存能够被用户态和内核态同时访问,对应的虚拟地址既可以是用户地址,也可是内核地址。如果某个内核虚拟地址的访问权限被设定为此组合,所有的普通应用程序都能够直接此内核地址。显然这个地址已超出任何普通应用程序自身的地址范围。由于虚拟地址空间的相互隔离,内核地址对应用程序本就不可见。而这个组合直接违反了二者隔离的安全设计,且操作系统内核对此是无法感知的。

按照上述页表遍历的方式,修改任意内核虚地址的访问属性需要内核任意地址读写原语(Arbitray R/W Primitive),这个条件是非常强的。如果攻击者已经拥有了这种原语,可直接获取系统最高权限。上述漏洞给予一次几乎任意内核地址写入的机会,在此条件下,常规的页表攻击方式基本失效。

假设某台安卓终端拥有3GB内存。在没有开启内核地址随机化防御机制时,常见的一级页表布局如下。

以"0xFFFFFFC000000000"起始的1GB内核虚地址空间为例,内核Image被加载到此范围。内核代码段的访问属性是R-X,而内核数据段的访问属性是RW-。因此,一级页表描述符一定是TABLE类型。

64位内核空间的虚拟地址绝大多数是无效的,比如"[0xFFFFFFC200000000, 0xFFFFFFC23FFFFFFF]"范围的地址都是无效的,其对应的一级页表项为空。假设此页表项不为空,存在一个BLOCK类型的页表项。其AP组合为'01',output address指向第一块1GB的物理内存,如图所示。

通常情况下,“0xFFFFFFC03000200”内核地址只能够被内核访问。而此时,“0xFFFFFFC230002000”内核地址能够被用户态和内核态同时访问。上述内核虚地址访问是同一块物理内存,二者的访问权限可完全不同。即可实现代码段在原有的虚拟地址范围是R-X权限,而在镜像虚拟地址范围是RW-权限且能够被所有的应用程序所访问。换句话说,内核所运行代码都能被直接篡改,内核层面的检测根本无从谈起。此时,根本不需要去获取系统的最高权限,因为系统内核代码已经完全可控,开启真正的上帝模式。

结合上述漏洞,攻击者已经可以将一个用于开启上帝模式的一级页表项写入到指定的位置,这个指定位置是需要精确计算的。Linux内核一级页表的起始地址保存在内核数据段的swapper_pg_dir,那么页表项的地址可以通过简单公式计算。对于开启内核地址随机化的系统,只需修正swapper_pg_dir的真实地址即可。

swapper_pg_dir+ (Kernel_Mirroring_Base / 1G) * 8

至此,上帝模式已经开启。攻击者可以运行如下的攻击代码。这段攻击代码直接修改内核数据,patch内核代码。而对于普通C开发程序员或者Linux内核开发人员来说,已经违背了现代操作系统的常识,绝对是无稽之谈。然而在上帝模式下,这段代码就能真实的运行。

在上帝模式下,攻击者已经可以在用户态直接操作内核,上述代码的攻击演示视频(http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0),此时Android 8终端的PXN和PAN内核防御机制已对攻击者完全无效。完整地获取Pixel 2XL手机的最高权限攻击的视频链接](http://v.youku.com/v_show/id_XMzU0MjA0NjY5Mg==.html?spm=a2h3j.8428770.3416059.1)。


3. 结尾

内核空间镜像攻击除了能够直接攻破安卓8重要的防御机制外,还能够将一些看似不能被利用,危害评级较低的漏洞赋予重生的能力,典型的例子CVE-2017-0583。

同时,这个漏洞被Google作为有效防御的案例在zer0conf2017([Your Move: Vulnerability Exploitation and Mitigation in Android](https://source.android.com/security/reports/zer0-conf-2017-Your-Move.pdf))上举例。关于如何100%成功率的利用这个漏洞的相关内容参看BlackHatAisa2018([KSMA: Breaking Android kernel isolation and Rooting with ARM MMU features](https://www.blackhat.com/docs/asia-18/asia-18-WANG-KSMA-Breaking-Android-kernel-isolation-and-Rooting-with-ARM-MMU-features.pdf))的后部分内容。


硬件设计的不合理危害性远高于软件层面,且修补更新更为困难。在设计之初就将安全性作为一项重要的指标是最佳的选择。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
最新回复 (14)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
厉害了!
2018-6-15 15:20
0
雪    币: 416
活跃值: (509)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
厉害的很,硬件漏洞更狠
2018-6-15 16:17
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
作者并没有绕过PAN,而是不需要绕过PAN,因为修改页表,直接开启了上帝模式。不过问题关键是如何修改页表,通过漏洞利用修改页表,还是要绕过PAN。
2018-10-24 09:41
0
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
团控==Thmosking??
2018-10-24 11:16
0
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
首先是利用其它的一个漏洞:对kernel space地址的任意位置写数据。
然后修改页表的内容,把AP属性,也就是把memory访问access permission改掉,改成页表mapping的地址可以user space和kernel space都可以访问的属性。
然后应用程序可以用kernel的VA来访问任意地址。
2018-10-24 11:48
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
endlif 首先是利用其它的一个漏洞:对kernel space地址的任意位置写数据。 然后修改页表的内容,把AP属性,也就是把memory访问access permission改掉,改成页表mapping的地 ...
问题是对kernel space地址的任意位置写数据,如果是堆破坏,还是要绕过PAN。如何绕过PAN呢?
2018-10-24 17:15
0
雪    币: 29
活跃值: (295)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
jltxgcy 问题是对kernel space地址的任意位置写数据,如果是堆破坏,还是要绕过PAN。如何绕过PAN呢?
看原文:

“虽然多次触发上述条件竞争漏洞将payload数据写入内核可以用于绕过PAN,但exploit代码执行成功率急剧下降。另外,借助其他内核漏洞(eg: CVE-2017-13164)可以将数据稳定写入内核,但在漏洞急剧减少的情况下,能否通过新的利用技巧同时绕过PXN和PAN防御机制,并获取系统最高权限?借助ARM处理器的MMU硬件特性,答案是肯定的。”

我理解的是它的那个条件竞争漏洞本身就是可以直接在内核写数据绕过PAN的。

视频里有poc的代码:http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0  




我看就是直接在kenerl写的代码。

2018-10-24 19:20
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
endlif 看原文:“虽然多次触发上述条件竞争漏洞将payload数据写入内核可以用于绕过PAN,但exploit代码执行成功率急剧 ...
原文:能否通过新的利用技巧同时绕过PXN和PAN防御机制,并获取系统最高权限?借助ARM处理器的MMU硬件特性,答案是肯定的。
这句话有误导,借助ARM处理器的MMU硬件特性,并没有绕过PAN,而是不需要绕过PAN了。绕过PAN还是需要把数据放在内核。
视频POC,省略了如何通过漏洞绕过PAN,写页表的过程;直接是前两步骤之后的从用户态写内核态。
所以ARM处理器的MMU硬件特性不能绕过PAN,只是不再需要绕过PAN了。
最后于 2018-10-25 08:44 被jltxgcy编辑 ,原因:
2018-10-25 08:43
0
雪    币: 7818
活跃值: (1073)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
换句话说,这不是硬件漏洞,硬件没有漏洞,而是软件漏洞造成写页表。arm公司不可能因为软件漏洞造成的写页表,承认自己硬件设计有漏洞。
最后于 2018-10-25 08:48 被jltxgcy编辑 ,原因:
2018-10-25 08:46
0
雪    币: 2253
活跃值: (2366)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
可以,前排围观。
2018-10-25 08:59
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
12
jltxgcy 换句话说,这不是硬件漏洞,硬件没有漏洞,而是软件漏洞造成写页表。arm公司不可能因为软件漏洞造成的写页表,承认自己硬件设计有漏洞。
之前也有研究人员问到我,我这里稍微做下解释。
1. 写页表是EL1->EL1,不需要绕过PAN。
2. 不管你如何修改页表,现代处理器都不存在有一个种模式需要从EL0直接访问EL1的VA。反过来是需要EL1访问EL0 VA的内容,这就是PAN防御机制需要保护的点。那EL0直接访问EL1的VA算不算设计缺陷? arm公司当然不会承认设计缺陷,所以我也只说这是MMU的一个feature. 之前高通承认这个设计是有问题的,但他们无权去修改这个设计。
3. 关于绕不绕过PAN的问题,不用纠结这个字眼问题,PAN本来就不针对这种作访问检测。能够直接在EL0直接修改内核代码段和数据段,还去用传统方式绕过PXN和PAN这么多此一举么。那你说这算不算绕过?换句话说,就和侧信道一样,偷取内容算不算有效攻击?

很少上看雪,密码都忘了,匿了。



2018-10-30 11:44
0
雪    币: 408
活跃值: (156)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
厉害~
2018-11-8 13:18
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
jltxgcy 作者并没有绕过PAN,而是不需要绕过PAN,因为修改页表,直接开启了上帝模式。不过问题关键是如何修改页表,通过漏洞利用修改页表,还是要绕过PAN。
这个漏洞怎么发现的,不看源码能发现么
2019-4-1 03:40
0
雪    币: 444
活跃值: (2745)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
15
我伪造假blcok 后,内核的代码区域还是改不了,非代码区域是可以改的, 一改程序就Killed
2020-4-7 11:32
0
游客
登录 | 注册 方可回帖
返回
//