劉 松,秦曉軍
(江南計算技術研究所,江蘇 無錫 214083)
Linux內核漏洞異步觸發模型的安全分析
劉 松,秦曉軍
(江南計算技術研究所,江蘇 無錫 214083)
近年來,由于Linux系統中越來越多防御機制(例如NX,ASLR,Canary)的出現,用戶態漏洞的利用已經十分困難,而Linux內核漏洞逐漸受到關注。內核內存破壞是一種典型的內核攻擊技術,攻擊者通過特定的函數調用控制內核內存,進而達到權限提升的目的。SMEP是一種有效抑制內核內存破壞攻擊的安全機制,使傳統的ret2usr內核攻擊方法失效。現有兩種繞過SMEP機制的技術途徑,分別為ret2dir技術和清除SMEP標志技術,均具有各自的局限性。文中發現了一種繞過SMEP安全機制的異步觸發內核漏洞新模型,該模型利用函數的間接尋址原理異步觸發漏洞,對于內存破壞的內核漏洞更具有普遍適用性。應用VMware虛擬機測試Ubuntu 16上的netfilter漏洞,并利用內核崩潰分析工具和VMware遠程調試工具分析崩潰現場和調試內核,以驗證異步觸發模型的有效性。實驗結果表明,所發現的新模型是一種危害嚴重的漏洞利用模型。
Linux內核漏洞;SMEP;間接尋址;異步觸發模型
針對緩沖區溢出普遍存在的、威脅巨大的網絡安全漏洞,誕生了多種安全緩解機制。用戶態緩沖區溢出漏洞的利用需要繞過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.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標志的技術,只能繞過一部分內核漏洞。發現了一種通過間接尋址,異步觸發內核漏洞的利用方式,對于修改函數地址的漏洞也有效,且更具普遍性。
提出了一種異步觸發內核漏洞的模型,該模型基于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);
}
狀態恢復是為了提高漏洞利用的穩定性,因為在漏洞利用過程中寄存器經歷了內核態和用戶態的相互轉換,因此需要保證段寄存器的穩定。
通過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安全機制的保護,并且權限提升成功,證明了異步觸發模型的有效性。
這種威脅非常危險,且更具普遍適用性,可以通過SMAP和KASLR機制進行防御。SMAP機制防止進程由內核態訪問用戶態數據,因此阻止了用戶態偽棧的訪問;KASLR機制隨機化內核函數地址和gadget地址,增加異步觸發漏洞的利用難度。然而,基于性能考慮,目前主流的Linux系統默認都沒有開啟這兩項內核安全機制。
內核內存破壞是廣泛存在的內核漏洞,而目前的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