PXN防护技术的研究与绕过

PXN的研究与绕过

Linux安全机制简介

近些年来,由于Android系统的兴起,作为Android底层实现的Linux内核其安全问题也是越来越被人们所关注。为了减小漏洞给用户带来的危害和损失,Linux内核增加了一系列的漏洞缓解技术。其中包括DEP,ASLR,更强的Selinux,内核代码段只读,PXN等等。

Linux中这些安全特性的增加,使得黑客们对漏洞的利用越来越困难。其中,DEP,ASLR,Selinux等技术在PC时代就已经比较成熟了。内核代码段只读也是可以通过修改ptmx_fops指针表等方案来绕过。那么,PXN是什么?它又该如何绕过呢?

PXN简介

PXN其实就是PrivilegedExecute-Never的缩写,按字面翻译就是“特权执行从不”。它的开启与否主要由页表属性的PXN位来控制,如图1所示。

图1

在没有PXN安全机制的Android机器上,我们一般的提权思路大致可分为如下几步:

1.   修改ptmx_fops表的fsync指针地址,使其指向我们用户态的提权代码。

2.   应用层调用fsync函数,使得系统触发我们的提权代码。

3.   获取root权限。

4.   将ptmx_fops表的fsync指针置为NULL,主要防止其他进程调用fsync而使系统崩溃。

上述说到的提权步骤是在没有PXN影响下的一般思路。那么在带有PXN的机器上表现又是如何呢?经过我们的多番测试,在不同的机型上表现各不相同。在有的机器上会卡住,shellcode不会继续执行;有的机器上会产生Kernel Panic,机器直接重启。

所以说,PXN的大致工作原理就是在内核状态下,系统是无法直接执行用户态代码的。因此,我们常用的提权思路也就行不通了。更加坑爹的是在绝大部分的arm64系统机型(如三星s6,华为p8),和一些arm32位机型(如三星note3,三星s5等主流机型)的最新ROM都默认开启了PXN。

PXN初探

在CVE-2015-3636漏洞的一种利用方式中,我们最终可以控制inet_release函数中sk->sk_prot->close指针的值。对应汇编代码如图2所示。

图2

图2中X2寄存器的值即为sk->sk_prot->close指针的地址,这里的X2对应着32位系统中的R2。BLR X2指令就是跳转到X2所指向的地址处执行。

在开启了PXN的机型上,如果我们将sk_prot->close指针的地址指向用户态的提权代码,那么系统就直接panic重启了,错误信息如图3。在这个panic信息中可以看到PC寄存器的值为0x558d15a2a8,是一个用户态地址。

图3

既然在内核状态下PXN机制能阻止系统运行用户态的代码,那么它会不会阻止内核层的代码执行呢?我们将sk_prot->close指针的地址指向了inet_release函数的返回处。代码如图4所示。

图4

此时再触发漏洞,函数能正确返回到用户态,并且系统也没有panic,从而验证了PXN是不会阻止内核态代码执行的。这和PXN自身的原理也是一致的。

再战PXN

基本思路

在带有PXN的机器上虽然不能执行用户态的shellcode,但是依然可以执行内核态的代码。因此,我们的策略就是使用内核ROP:构建内核gadget,使得栈指针sp泄露,然后通过sp计算得到thread_info结构的地址,之后patch thread_info结构的addr_limit字段,从而达到用户态任意读写内核态的目的。

构建gadget

接下来,我们的主要目的就是验证上述方案的可行性。首要任务就是寻找合适的内核gadget。

假设我们现在已经可以利用漏洞控制X1寄存器的值,如图5所示。

图5

因此,在寻找ROP需要的gadget时,我们以X1所指向的内存区域为基础来控制其他寄存器的值。在触发漏洞前,通过mmap函数来创建一块用户态可以控制的内存空间。如下所示:

void *map_addr_tmp= mmap((void*) 0x30303000, 0x10000,

PROT_WRITE|PROT_READ|PROT_EXEC,

MAP_SHARED|MAP_ANONYMOUS|MAP_FIXED, -1, 0

);

做完了上面的准备工作,接下来,我将上述方案分解成下面三步来完成:

1.泄露sp的值;

2.计算addr_limit的地址;

3.patch addr_limit。

首先,用ROP来完成sp的泄露。因为寄存器X1所指向的地址是我们在用户态自己分配出来,并且可以随意控制的内存块,所以我们在第一段gadget中借由X1来布局各个跳转的地址,然后跳转到下一段gadget开始执行。

第二段gadget主要是将sp栈指针的值赋给X0,然后跳转到下一段gadget。在这个例子里面,用户态是无法直接通过X0来获得sp的。所以我们在gadget3里面通过一条STR指令将X0的值保存到用户态。ROP的大致思路如图6所示。

找gadget在某种程度上是一个体力活,当然也可以通过一些工具来Make life easier,大家可以自行Google。注意这里描述的gadget只是一个大致的思路,和实际中可能会有一些区别。

图6

我们得到sp的值后,就可以计算出addr_limit字段的地址了。在arm64系统上,栈的最大深度为16K。其次,addr_limit字段位于thread_info结构+8的位置。因此,计算方式如下所示:

unsigned long thread_info_addr = sp & 0xFFFFFFFFFFFFC000;

unsigned long addr_limit_addr = thread_info_addr + 8;

printf("addr_limit_addr: %p\n", addr_limit_addr);

最后,我们通过ROP来设置addr_limit的值为0xFFFFFFFFFFFFFFFF。同样,X1寄存器我们可以随意控制其内容。第一段gadget用来设置各个跳转地址。第二段gadget完成主要任务,即通过一个STR指令来完成patch addr_limit的目的。最后跳转到inet_release的函数返回处。ROP的大致思路如图7所示。

图7

完成了addr_limit字段的patch之后,那么用户态就可以任意读写内核态了。接下来的选择就很多了,一种方法是先确定task_struct的地址,它是在thread_info+0x10的位置。得到了task_struct的地址之后,就可以定位到cred字段,之后patch uid、gid、capability、selinux等即可。

实践中,通过结合已知的漏洞,上述方案在近期发布的一些64位旗舰机型上均能测试成功,如图8所示。当然,这个思路在32位机型上也同样适用。

图8

假设我们所使用的是一个任意写的漏洞,那么绕过PXN的方式其实是类似的。首先通过任意写的洞控制Kernel的一个函数指针,指向我们的gadget,泄露出sp的值。接下来,可以直接通过任意写的能力去patch addr_limit(不需要再通过ROP去patch了)。

总结

近些年来随着对Android、Linux的研究越来越深入,通用的Linux平台漏洞,例如:CVE-2013-6282、CVE-2014-3153 (towelroot)以及最新的CVE-2015-3636(pingpong)纷纷被公之于众。

同时,Linux上运用的最新的漏洞缓解机制让系统漏洞的利用越发困难,但绕过这些缓解机制的技术也在推陈出新。攻与防的博弈永远不会结束。

参考文章:

http://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=1d4d37159d013a4c54d785407dd8902f901d7bc5

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.architecture.reference/index.html

https://bugzilla.redhat.com/show_bug.cgi?id=1218074

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 20:22:28

PXN防护技术的研究与绕过的相关文章

Oracle数据库监听器引起的安全威胁和防护技术

1.引言 在今年的两会上,<政府采购法实施条例>正式实施.虽然安全行业迎来了数据库国产化的春天,但现今Oracle依旧是中国政府机关,使用最广泛的数据库.其安全性受到广泛关注. Oracle数据库必须使用TNS Listener(数据库监听器)来完成数据库和客户端之间的通讯.因此TNS Listener的漏洞成了很多黑客的主要目标.这些TNS Listener的漏洞如果不及时处理,将对用户的信息资产造成重大损失,同时也使许多敏感信息处于危险境地.本文主要对TNS Listener的漏洞带来的安

基于802.11Fuzz技术的研究

转自安全客 关于无线的Fuzz最开始接触了解时,国内基本毛线都搜不到.经过几个月的资料搜集和学习,将大约全网的fuzz资料整理翻译分析并读懂写下,就为填补国内空白,也希望无线爱好者能多多交流. 在各个安全领域的漏洞挖掘方法中,Fuzz都挺流行的. Fuzz是一种黑盒软件测试技术,这基本上是使用畸形或半自动化的方式在一个畸形的数据注入发现执行错误,运用在协议也比较多.当源代码是不可用的时候,还是不错的,在802.11协议方面,Fuzzing的层面也比较多,特别是针对驱动和接入点的. 802.11的

亚米级低成本室内定位技术的研究 智能三维空间建模和数据集成

信工论坛77期:主题:?The Holy Grail of Sub-meter Indoor Localization with Low-cost Infrastructure亚米级低成本室内定位技术的研究 时间:6月1日下午3:00??? 地点:教一楼201 ? Abstract:Despite?the?fact?that?people?spend?majority?of?their?time?indoor,?indoor?positioning?systems?(IPS)?only?have

[blog]基于SURF特征的图像与视频拼接技术的研究和实现(一)

基于SURF特征的图像与视频拼接技术的研究和实现(一) 一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条理清晰.内容完整.实现的技术具有市场价值.因此定下决心以这篇论文为基础脉络,结合实际情况,进行“基于SURF特征的图像与视频拼接技术的研究和实现”. 一.基于opencv的surf实现 3.0以后,surf被分到了"opencv_contrib-master"中去,操作起来不习惯,这里仍然选择一直在

CRISPR/Cas基因编辑技术最新研究进展

CRISPR/Cas系统是目前发现存在于大多数细菌与所有的古菌中的一种后天免疫系统,其以消灭外来的质体或者噬菌体并在自身基因组中留下外来基因片段作为“记忆”. CRISPR/Cas 系统全名为常间回文重复序列丛集/常间回文重复序列丛集关联蛋白系统(clustered regularly interspaced short palindromic repeats/CRISPR-associated proteins).目前已发现三种不同类型的 CRISPR/Cas系统,存在于大约40%和90%已测

3D打印技术的研究成果-3D打印机厂家

3D打印技术,是以计算机三维设计模型为蓝本,通过软件分层离散和数控成型系统,利用激光束.热熔喷嘴等方式将金属粉末.陶瓷粉末.塑料.细胞组织等特殊材料进行逐层堆积粘结,最终叠加成型,制造出实体产品.与传统制造业通过摸具.车铣等机械加工方式对原材料进行定型.切削以最终生产成品不同,3D打印将三维实体变为若干个二维平面,通过对材料处理并逐层叠加进行生产.不需要众多的人力,直接从计算机图形数据中便可生成任何形状的零件,使生产制造得以向更广的生产人群范围延伸. 然而,通过专项研究,3D打印主要的技术形式有

对技术的研究就是对世界的理解

技术研究真的很爽,像吃鸦片一样,虽然我没有吃过,但估计就是那种感觉.当深入研究某一样东西的时候(没有人催,没有estimate),时间过得特别快,其它的事物都不存在一样,除了饿了渴了身体会发出信号外. 这是一种哲学,是格物致知,我们对技术格呀格呀格,就得到了真理了.技术反应了这个世界,了解技术的本质,就是加深对世界的理解.虽然世界有万事万物,但它们终究都会回归到一个相同的地方,会回归一条基本的准则,这是世界运行的基本的方式. 在国内很少见到有专门研究技术的部门,除了在华为看到有这样的部门外(因为

计算机类产品评价技术指标体系研究之图形(像)篇

    (一)显卡 对于核心的显卡来说,显存工作频率越高性能越好,而显存的ns数值越小的显存能跑更高的频率,所以显存的ns被认为是显卡选购的关键之一,另外就是显存的品牌.显卡和主板上都有"内存",不过主板上的那种被称为内存条,而显卡上的被称为显存.显存与系统内存用的都是完全相同的技术.不过高端显卡需要比系统内存更快的存储器,所以越来越多显卡厂商转向使用GDDR3和GDDR5技术. 显卡用的DDR2和DDR3与主板上的DDR2和DDR3有所不同,其中最主要的是电压不同.因此显卡用的被称为

计算机类产品评价技术指标体系研究之存储篇

   (一)内部存储存(内存)性能指标 (1)速度(存取时间)--内存速度一般用于存取一次数据所需的时间(单位一般为ns)作为性能指标,时间越短,速度就越快.   (2)容量--内存是电脑中的主要部件,它是相对于外存而言的.内存是越多越好,但要受到主板支持最大的容量的限制,而且就是目前的电脑而言,这个限制仍是阻碍.   (3)内存的线数--指内存条与主板接触时接触点的个数,这些接触点就是金手指,有72线.168线和184线等.72线.168线和184线内存条数据宽度分别为8位.32位和64位.