APP下载

Linux内核漏洞异步触发模型的安全分析

2017-11-20秦晓军

计算机技术与发展 2017年11期
关键词:寄存器内核漏洞

刘 松,秦晓军

(江南计算技术研究所,江苏 无锡 214083)

Linux内核漏洞异步触发模型的安全分析

刘 松,秦晓军

(江南计算技术研究所,江苏 无锡 214083)

近年来,由于Linux系统中越来越多防御机制(例如NX,ASLR,Canary)的出现,用户态漏洞的利用已经十分困难,而Linux内核漏洞逐渐受到关注。内核内存破坏是一种典型的内核攻击技术,攻击者通过特定的函数调用控制内核内存,进而达到权限提升的目的。SMEP是一种有效抑制内核内存破坏攻击的安全机制,使传统的ret2usr内核攻击方法失效。现有两种绕过SMEP机制的技术途径,分别为ret2dir技术和清除SMEP标志技术,均具有各自的局限性。文中发现了一种绕过SMEP安全机制的异步触发内核漏洞新模型,该模型利用函数的间接寻址原理异步触发漏洞,对于内存破坏的内核漏洞更具有普遍适用性。应用VMware虚拟机测试Ubuntu 16上的netfilter漏洞,并利用内核崩溃分析工具和VMware远程调试工具分析崩溃现场和调试内核,以验证异步触发模型的有效性。实验结果表明,所发现的新模型是一种危害严重的漏洞利用模型。

Linux内核漏洞;SMEP;间接寻址;异步触发模型

1 背 景

针对缓冲区溢出普遍存在的、威胁巨大的网络安全漏洞,诞生了多种安全缓解机制。用户态缓冲区溢出漏洞的利用需要绕过NX,ASLR,PIE,RELRO与Canary等多种安全机制[1-2],因此变得非常困难。与之相比,内核漏洞的安全机制发展还不健全,因此更容易被攻击者利用[3-4]。在Linux系统中,内核拥有大量的代码,并且随着版本不断变化,从2005年发布的2.6.12版本到2015年发布的4.2版本,十年间经历了51个大版本。此外,内核拥有多个子系统,因此存在更大的攻击面。如图1所示,近年来的内核漏洞受到关注度越来越高[5]。

内核漏洞分为多种类型,包括内核栈溢出、内核堆溢出、空指针引用、信息泄露、条件竞争、数组越界(OOB)、整数溢出等[6]。传统的内核漏洞都是通过ret2usr被利用的,此技术通过修改内核函数指针,将程序执行流转交给方便控制的用户态,进而实现权限提升的目的。针对这些内核漏洞和ret2usr的利用方式,诞生了相应的安全缓解机制。其中,mmap_min_addr机制禁止mmap函数在低地址的映射,使得空指针攻击无效[7];针对内核栈溢出攻击,提出栈保护机制;内核代码段和数据段分别设置为只读和不可执行;限制kallsyms、dmesg、slabinfo等关键信息的访问权限,降低了内核信息泄露的风险;SMEP(Supervisor Mode Execute Prevention)机制阻止代码由内核进入用户态空间;SMAP(Supervisor Mode Access Prevention)机制阻止高权限进程对用户态数据的访问;针对内核ROP攻击,Pax开发了内核地址随机化(Kernel Address Space Layout Randomization,KASLR)的防御机制[8]。

图1 Linux内核漏洞数量变化趋势

虽然上述安全机制极大提高了内核漏洞被成功利用的难度,但也研究发现了一种通过异步触发内核漏洞的利用模型,根据内核函数间接寻址的原理,其能够绕过除SMAP和KASLR的多种安全机制,相比传统内核漏洞的利用方式更具有普遍性和适用性。

2 内核漏洞利用技术

2.1ret2usr攻击与防御

Linux内核漏洞往往会导致某些内核内存被修改,甚至会造成某种范围的任意地址写,例如OOB、UAF等[9-10]。根据修改形式,任意地址写可以分为三种:任意地址内容加,如CVE-2013-2094漏洞;任意地址内容减,如Ubuntu 16.04中netfilter组件的OOB漏洞可以导致某些地址(起始地址为0的32位地址)内容减一;结构体中的内容被任意替换,如CVE-2016-0728的use-after-free漏洞。

在任意地址写的情况下,返回用户攻击(return to user,ret2usr)成为一种常用的内核漏洞利用技术。在这种攻击中,攻击者修改某个内核函数(或者数据指针)为某个用户态空间地址,并在此用户空间填充权限提升载荷。当触发此内核函数时,执行流将会重定位到用户态空间,并且执行权限提升载荷,一般是通过commit_creds(prepare_kernel_cred(0))来实现的。由于程序是在内核态下执行的,因此可以成功将普通用户权限提升为超级用户。

事实上,ret2usr攻击利用了内核空间与用户空间没有绝对隔离的特点,而且内核对整个地址空间有绝对的访问和执行权限。为了抵御这种攻击,诞生了一种被称为SMEP的安全机制。SMEP是一种内核隔离机制,阻止代码从高权限状态进入用户态空间。在现代Intel处理器上,CR4寄存器包含SMEP安全机制开关的标志,并且内存区域包含supervisor标志内存是否可被特权进程执行。当SMEP标志位被设置时,会阻止在内核态执行的程序在不含supervisor标志的内存区域执行代码,这种机制使得ret2usr的攻击无效。

2.2ret2dir技术

为了绕过SMEP安全机制的防御,产生了两种不同的绕过手段,ret2dir就是其中一种利用技术,该技术利用了physmap的内存管理机制[11]。

physmap是一块连续的虚拟内核内存空间,为了提高效率,该空间地址和RAM地址直接映射。当physmap空间小于RAM空间时,physmap到RAM空间的映射关系为满射,即对于任何RAM地址都存在physmap虚拟地址与之对应。另一方面,用户空间的虚拟地址也会映射到RAM。因此存在两个虚拟内存地址映射到同一个RAM地址的情况,即式(1)。

(1)

基于此,如果存在映射到相同物理地址的内核-用户虚拟地址对,只需将执行流跳转到内核空间,即可执行对应的用户态空间代码,而且不会触发SMEP保护机制。如图2所示,攻击者首先利用physmap机制寻找可执行的内核-用户地址对(X1,X2),并将内核函数地址X覆盖为X1,同时在相对应的用户态空间X2装载权限提升载荷。当触发内核函数X时,程序首先跳转到内核地址,由于此内核地址与用户态地址共享同一块物理内存,因此实际上执行实现权限提升载荷。

图2 ret2dir利用

ret2dir技术巧妙地利用physmap的数据共享原理,可以完全欺骗软硬件层面的内核隔离策略,如SMEP安全机制。在文献[12-13]中,ret2dir技术应用于基于碰撞技术控制内核对象的内核use-after-free漏洞的利用上。然而,该技术也存在很大的局限。对于32位系统,由于physmap空间与RAM大小相近,因此很可能无法满足式1;而对于内存较大的系统,寻找内核-用户对会浪费大量时间。

2.3清除SMEP标志

通过内核ROP清除CR4寄存器中的SMEP标志位,然后通过正常的ret2usr技术提升权限,是另外一种绕过SMEP的方式。与用户态空间的ROP技术类似,内核ROP通过寻找内核中可执行的gadget指令构成ROP链,实现清除SMEP标志位的目的。

为了控制ROP链,内核ROP技术需要修改rsp寄存器到用户态空间,并构造一个合适的伪栈来串联所有gadget指令,一般通过以下三种方式更改栈顶rsp,此类指令为xchg_gadget。其中reg为修改rsp所需的寄存器,且此寄存器的值必须为用户态地址。

(1)mov rsp, reg; ret

(2)addrsp, xxx; ret

(3)xchg rsp, reg; ret

假设被修改的内核地址X为某个函数func的指针,例如漏洞CVE-2013-1763由于越界访问,修改函数dump的指针为用户态地址,假设为addr_usr,即满足式(2)。

&func=addr_usr

(2)

如果将addr_user地址装载xchg_gadget地址,并在用户态空间构造伪栈,则可通过addr_usr作为跳板实现漏洞利用。

而如果被修改的内核地址X为某个函数地址,例如最新的Ubuntu 16系统上netfilter子系统中的OOB内核漏洞,如果直接将函数地址修改为用户态地址,则访问该函数会触发SMEP机制;而直接将X修改为xchg_gadget,又不存在合适的转换条件。因此,传统的通过清除SMEP标志的技术,只能绕过一部分内核漏洞。发现了一种通过间接寻址,异步触发内核漏洞的利用方式,对于修改函数地址的漏洞也有效,且更具普遍性。

3 异步触发模型

提出了一种异步触发内核漏洞的模型,该模型基于Linux内核函数的间接寻址结构,通过该模型能够绕过SMEP机制,并实现权限提升。

3.1间接寻址结构

无论是任意地址写漏洞还是UAF对象替换漏洞,攻击者往往选择修改一个内核函数。而且关于某个设备或者对象的操作函数,往往全部存储在某个函数结构体中。例如ptmx设备的函数全部保存在ops结构体中;内核对象keyring的操作函数全部保存在结构体key_type中。

以ptmx设备为例,当攻击者能够做到任意地址写时,通过修改ptmx_fops中某些函数的值为用户态,例如release函数,则可以通过调用关闭ptmx设备的函数,将执行流转换到用户态空间,实现ret2usr的利用,见图3。

图3 ptmx间接寻址结构

而对于添加了SMEP机制的操作系统,直接修改ptmx_fops中的函数,会触发SMEP保护机制。类似于CVE-2013-0176漏洞,需要通过修改某个函数的指针,如release函数的指针地址。提出了一种更为通用的方法,通过修改ptmx_fops地址间接更改ptmx_fops结构体中所有函数的地址,如式(3)。

release=ptmx_ops+offset

(3)

此时调用设备的第一个函数,就会触发内核漏洞,对于设备ptmx的操作首先会调用open函数。由于通过漏洞修改的地址与触发漏洞的地址不是同一地址,而是存在包含关系,因此称这种基于间接寻址关系的漏洞触发模式为异步触发。

3.2控制寄存器

为了通过ROP实现漏洞利用,需要将内核态地址的寄存器rsp修改到用户态地址,只有这样在gadget返回后才能够继续控制程序。因此首先需要寻找与rsp交换的寄存器reg,此寄存器必须满足以下两个条件:

(1)存在关于reg的xchg_gadget;

(2)reg存储的地址可以被mmap,即不能违反mmap_min_addr的防御限制。

以设备ptmx为例,通过分析内核代码可知相关函数全部保存在结构体ptmx_fops中,而后者又保存在ptmx_cdev中。通过在ptmx_cdev中修改ptmx_fops的地址为用户态,在调用设备ptmx的任意地址时,则会导致崩溃。通过分析崩溃现场,获取漏洞函数间接寻址的汇编代码细节,并根据上述两个约束条件找到合适的寄存器组织xchg_gadget。通过内核文件解压并提取类似于rsp和上述寄存器的gadget地址,即可完成rsp寄存器由内核态陷入用户态的过程。

3.3构造伪栈

通过在用户态构造伪栈,依次实现清除SMEP标志位和权限提升两个功能。清除SMEP通过如图4所示的gadget链来实现,由于SMEP标志位保存在第20位,因此通过cr4^0xfffff值覆盖原寄存器即可清除SMEP标志位。之后,则可以将控制流转移到权限提升代码中,通过传统的ret2usr方式利用。

gadget地址寻找通过内核解压与gadget发现两种工具实现。ROPgadget是一个gadget收集与快速查找的工具,不仅能够发现正常模式的gadget,还能够发现非ret结尾的gadget。

图4 清除SMEP

3.4提权与状态恢复

在关闭SMEP标志位后,权限提升则通过经典的两个函数实现,可以成功修改为超级用户,如下所示:

void_attribute_((regparm(3)))payload();{

commit_creds(prepare_kernel_cred(0);

}

状态恢复是为了提高漏洞利用的稳定性,因为在漏洞利用过程中寄存器经历了内核态和用户态的相互转换,因此需要保证段寄存器的稳定。

4 实验验证

通过Ubuntu 16上的netfilter漏洞验证异步触发模型的有效性,实验需要多种工具的支持[14],包括Linux本地调试内核崩溃的工具crashdump,Linux特定版本的内核符号表dbgsym,解压内核的脚本extract-vmlinux,通过正则表达式寻找合适的内核gadget的工具ROPgadget。

实验选定版本为Ubuntu 16-4.4.0-21-generic系统,通过内核崩溃分析和VMware远程调试两种方法分析漏洞,前者能够最高效地分析崩溃现场,后者能够动态调试内核。

4.1无SMEP分析

首先分析在关闭SMEP机制时的利用,在开机选项手动添加nosmep指令,即可关闭SMEP。此漏洞在compat_release_entry函数存在漏洞,如果参数满足一定条件,即可对参数地址的内容进行连续的两次减一操作。

将参数设为ptmx_fops中的release函数地址(0xffffffff821de448)附近,通过0xffffff/2次操作即可将其修改为用户态地址(0xff821de448)。同时在用户态地址装载权限提升载荷,即可实现权限提升,成功利用漏洞。

4.2间接寻址结构

开启SMEP安全机制后,执行原POC会触发SMEP机制,导致系统崩溃。根据异步触发模型,需要确定tty_release的间接寻址结构。通过VMware远程调试和内核源码分析可以得到图3所示的数据结构,并通过内核崩溃文件分析ptmx_fops的地址。

通过分析可知,ptmx_cdev中保存的ptmx_fops的地址为0xffffffff821de508,将此地址修改为用户态地址即可实现漏洞异步触发模式。

4.3寄存器确定

当修改ptmx_fops地址为用户态地址时,第一个被调用的地址即会触发漏洞,在本漏洞中为open。将open的地址(用户态地址)内容设为某个不可执行的内核态地址,这时不会触发SMEP保护机制,但是会导致系统崩溃。

通过crashdump工具分析崩溃文件,可以得到崩溃时的函数调用链和崩溃前的寄存器状态,如图5所示。

图5 漏洞崩溃现场

由于open地址无效,因此触发page_fault函数可能导致系统崩溃,此时寄存器rbx的值为用户态(0xff821de3e0),且通过上层函数汇编代码分析,rbx寄存器存储着结构体ptmx_fops的地址。因此,可以选取rbx寄存器作为交换寄存器,修改rsp为用户态的值,并通过ROPgadget寻找xchg_gadget。

4.4构造伪栈

通过选定寄存器可以将栈顶寄存器rsp转为用户态,之后通过精心布置伪栈即可实现清除SMEP标志、权限提升的过程。

图6展示了伪栈的分布,其中数字编号代表执行流程。

当调用ptmx_ops->open函数时,由于此函数被更改到用户态空间,因此执行伪栈偏移为0x58的指令,此地址保存了xchg_gadget指令,交换寄存器rbx和rsp的内容,并返回到栈帧首地址,此为过程(1);过程(2)为了拥有足够空间,通过gadget1将执行流跳转到偏移为0x98的地方;过程(3)首先维护栈平衡,然后通过gadget3和gadget4修改寄存器CR4为0x406f0,此时SMEP标志被清除,最后将执行流转到提权函数上。

图6 伪栈构造

通过漏洞对ptmx_ops地址的修改以及伪栈的构造,成功绕过了SMEP安全机制的保护,并且权限提升成功,证明了异步触发模型的有效性。

5 防 御

这种威胁非常危险,且更具普遍适用性,可以通过SMAP和KASLR机制进行防御。SMAP机制防止进程由内核态访问用户态数据,因此阻止了用户态伪栈的访问;KASLR机制随机化内核函数地址和gadget地址,增加异步触发漏洞的利用难度。然而,基于性能考虑,目前主流的Linux系统默认都没有开启这两项内核安全机制。

6 结束语

内核内存破坏是广泛存在的内核漏洞,而目前的SMEP机制很好地抑制了传统内核利用方式。文中发现了一种适用性更强、危害更大的异步触发漏洞模型,能够通过异步触发绕过SMEP机制的防御,在Ubuntu 16虚拟机上的最新漏洞也验证了该模型的有效性。尽管SMAP和KASLR机制能够抵御这种利用手段,但是大部分机器并没有默认开启,因此需要得到更多的关注。

[1] 吴 咏,汪晓茵,刘凤霞.Linux系统缓冲区溢出防护技术[J].保密科学技术,2012(5):21-25.

[2] 杨少鹏,唐小虎.基于Linux的栈溢出攻击防护系统[J].计算机应用研究,2005,22(12):127-130.

[3] 左玉丹,丁 滟,魏立峰.Linux内核提权攻击研究[J].计算机工程与科学,2016,38(11):2234-2239.

[4] 李晓琦,刘奇旭,张玉清.Linux内核提权漏洞自动利用系统的设计与实现[C]//信息安全漏洞分析与风险评估大会.北京:出版者不详,2013.

[5] Chen H,Mao Y,Wang X,et al.Linux kernel vulnerabilities:state-of-the-art defenses and open problems[C]//Proceedings of the second Asia-Pacific workshop on systems.New York:ACM,2011.

[6] 范文良.Linux内核驱动中整数溢出漏洞检测的研究[D].北京:清华大学,2014.

[7] Argyroudis P,Glynos D.Protecting the core:kernel exploitation mitigations[C]//Black hat Europe.[s.l.]:[s.n.],2011.

[8] Kemerlis V P,Portokalidis G,Keromytis A D.kGuard:lightweight kernel protection against return-to-user attacks[C]//USENIX conference on security symposium.[s.l.]:USENIX Association,2012:459-474.

[9] 傅建明,刘秀文,汤 毅,等.内存地址泄漏分析与防御[J].计算机研究与发展,2016,53(8):1829-1849.

[10] 李晓琦,刘奇旭,张玉清.基于模拟攻击的内核提权漏洞自动利用系统[J].中国科学院大学学报,2015,32(3):384-390.

[11] Kemerlis V P,Polychronakis M,Keromytis A D.ret2dir:rethinking kernel isolation[C]//USENIX conference on security symposium.[s.l.]:USENIX Association,2014:957-972.

[12] Xu W,Li J,Shu J,et al.From collision to exploitation:unleashing use-after-free vulnerabilities in Linux kernel[C]//ACM conference on computer and communications security.[s.l.]:ACM,2015:414-425.

[13] Xu W,Fu Y.Own your android! yet another universal root[C]//USENIX conference on offensive technologies.[s.l.]:USENIX Association,2015.

[14] 张 磊,王学慧.Linux内核调试技术[J].计算机工程,2003,29(10):81-83.

SecurityAnalysisonAsynchronousTriggeringModelofLinuxKernelVulnerability

LIU Song,QIN Xiao-jun

(Jiangnan Institute of Computing Technology,Wuxi 214083,China)

In recent years,more and more defense mechanisms like NX,ASLR,Canary make it difficult to exploit user vulnerabilities in Linux system.On the contrary,Linux kernel vulnerabilities have been getting attention.Kernel memory corruption is a typical kernel attack technique.Attackers can control kernel memory by calling special functions,even privilege escalation.SMEP security is an effective mechanism to suppress kernel memory corruption attacks,making the traditional ret2usr attack useless.Ret2dir and clear SMEP flag are two kinds of technologies to bypass SMEP,however,they both have their limitation.A new model is found to bypass SMEP,which can exploit the kernel vulnerability asynchronously with the principle of indirect addressing,and it is more effective to the kernel vulnerabilities of memory corruption.To verify its effectiveness,the netfilter vulnerability of Ubuntu 16 on VMware is tested,then the crash snapshot and debug kernel are analyze with kernel crash and VMware remote debug tools.The experimental results show that it is a serious exploit model.

Linux kernel vulnerability;SMEP;indirect addressing;asynchronous triggering model

2016-11-15

2017-03-03 < class="emphasis_bold">网络出版时间

时间:2017-07-19

国家自然科学基金资助项目(91430214)

刘 松(1992-),男,硕士生,CCF会员,研究方向为网络安全;秦晓军,博士,高级工程师,CCF会员,研究方向为网络安全。

http://kns.cnki.net/kcms/detail/61.1450.TP.20170719.1111.062.html

TN915.08

A

1673-629X(2017)11-0123-05

10.3969/j.issn.1673-629X.2017.11.027

猜你喜欢

寄存器内核漏洞
漏洞
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
Lite寄存器模型的设计与实现
基于selenium的SQL注入漏洞检测方法
微软发布新Edge浏览器预览版下载换装Chrome内核
二进制翻译中动静结合的寄存器分配优化方法
移位寄存器及算术运算应用
漏洞在哪儿