快捷搜索:  网络  后门  CVE  渗透  木马  扫描  黑客  as

隐躲在ARM处理器深处的神秘力量

1、媒介

在当代操作体系中,体系运行的内核空间以及应用程序的用户空间相互隔离,以保障操作体系的稳定性。以运行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。

隐躲在ARM处理器深处的神秘力量

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

隐躲在ARM处理器深处的神秘力量

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

通过奇奥的堆布局并笼盖适合的内查对象(eg: iovs),能够将其转化为在前提竞争下,几乎任意内核地址的一次写操作。堆布局实例以下:

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

隐躲在ARM处理器深处的神秘力量Android 8引入了PAN防御机制,使得内核没法直接走访用户态数据,上述绕过PXN防御机制的要领立即失效。

隐躲在ARM处理器深处的神秘力量

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

2. 内核空间镜像攻击

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

隐躲在ARM处理器深处的神秘力量尽大多数的当代处理器已带有地址治理单元MMU,上述捏造地址转换关系实际由其自动实现。ARM处理器也不例外,其通用的的地址转换关系如图所示。安卓体系采用三级页表,Level 0页表并未使用。

隐躲在ARM处理器深处的神秘力量各级页表中的描摹符不仅包含了下一级肇始物理地址,还包含了对这段内存的走访属性。ARM有两种描摹符block以及table。

隐躲在ARM处理器深处的神秘力量最后一级页表单独表示。

隐躲在ARM处理器深处的神秘力量

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

隐躲在ARM处理器深处的神秘力量内存的执行属性由XN比特决定,PXN比特决定该内存的代码能否在内核态执行。而AP[2:1]两比特的组合决定了内存的读写权限。

隐躲在ARM处理器深处的神秘力量

其中,’01′组合比较希罕。按照此种设计,该内存能够被用户态以及内核态同时走访,对应的捏造地址既可以是用户地址,也可是内核地址。要是某个内核捏造地址的走访权限被设定为此组合,所有的普通应用程序都能够直接此内核地址。显著这个地址已越过任何普通应用程序自身的地址范围。由于捏造地址空间的相互隔离,内核地址对应用程序本就不可见。而这个组合直接背反了二者隔离的安全设计,且操作体系内查对此是没法感知的。

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

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

隐躲在ARM处理器深处的神秘力量

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

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

隐躲在ARM处理器深处的神秘力量

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

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

swapper_pg_dir + (Kernel_Mirroring_Base / 1G) * 8

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

隐躲在ARM处理器深处的神秘力量隐躲在ARM处理器深处的神秘力量

在上帝模式下,攻击者已经可以在用户态直接操作内核,上述代码的演示视频:

看不到?点这里

此时Android 8终端的PXN以及PAN内核防御机制已对攻击者完全无效。完备地获取Pixel 2XL手机的最高权限攻击的视频链接:

看不到?点这里

3. 结尾

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

隐躲在ARM处理器深处的神秘力量

同时,这个漏洞被Google作为有用防御的案例在zer0conf2017上举例。关于怎么样100%成功率的行使这个漏洞的相干内容参看BlackHatAisa2018 的后部分内容。

硬件设计的分歧理风险性遥高于软件层面,且修补更新更为难题。在设计之初就将安全性作为一项重要的指标是最好的选择。

*

您可能还会对下面的文章感兴趣: