阿里安全潘多拉實驗室,主要聚焦于移動安全領(lǐng)域,包括對iOS和Android系統(tǒng)安全的攻擊和防御技術(shù)研究。在今年3月的BlackHat Asia和4月份的HITB上,該實驗室成員團(tuán)控(主攻方向為安卓系統(tǒng)級漏洞的攻防研究),受邀做了主題為《內(nèi)核空間鏡像攻擊》的演講。
以下為相關(guān)主題的技術(shù)分析文章,希望與同仁一起研究探討。
一、前言
在現(xiàn)代操作系統(tǒng)中,系統(tǒng)運(yùn)行的內(nèi)核空間和應(yīng)用程序的用戶空間相互隔離,以保證操作系統(tǒng)的穩(wěn)定性。以運(yùn)行Linux內(nèi)核的ARM終端為例,內(nèi)核空間和用戶空間擁有不同的頁表信息,并保存于不同的硬件寄存器。另外,內(nèi)核運(yùn)行時的特權(quán)等級高于用戶態(tài)程序,無論何時內(nèi)核空間對普通程序是不可見的。然而,ARM處理器的某些特殊硬件特性能夠打破這種保護(hù),使得普通程序在用戶態(tài)能夠直接訪問內(nèi)核空間,直接打破內(nèi)核空間與用戶空間的隔離,修改內(nèi)核代碼,開啟上帝模式。

下文以安卓8終端為載體,介紹阿里安全潘多拉實驗室成員研究并提出的內(nèi)核空間鏡像攻擊利用技巧。
二、正文
1. 背景
2017年下,Google發(fā)布了Android 8(奧利奧)系統(tǒng)。新系統(tǒng)在安全方面引入了多種內(nèi)核安全加固特性,以對抗漏洞程序獲取手機(jī)的最高權(quán)限。其中,最為重要的安全特性就是PAN(Privileged Access Never)和KASLR(Kernel AddressSpace Layout Randomization)??梢?,利用一個漏洞來獲取眾多最新手機(jī)系統(tǒng)的最高權(quán)限是非常有挑戰(zhàn)性的。
在詳述內(nèi)核空間鏡像攻擊之前,首先簡單介紹ReVent通用ROOT方案。該方案基于@林雷雷(Aliaba Group)發(fā)現(xiàn)的一個linux內(nèi)核BUG。
這個BUG存在與notification內(nèi)核系統(tǒng)調(diào)用:
[1]處計算文件名的長度,并根據(jù)長度在[2]分配相應(yīng)的存儲buffer,在[3]拷貝文件名字符串。這個BUG在于,從[1]到[3]的代碼路徑上,此文件能夠被重命名,導(dǎo)致[3]發(fā)生內(nèi)核堆越界覆蓋。
通過巧妙的堆布局并覆蓋適合的內(nèi)核對象(eg: iovs),能夠?qū)⑵滢D(zhuǎn)化為在條件競爭下,幾乎任意內(nèi)核地址的一次寫操作。堆布局實例如下:
為了向普通應(yīng)用程序提供服務(wù),用戶程序的地址空間對操作系統(tǒng)內(nèi)核是可見的。為了防止內(nèi)核直接執(zhí)行用戶程序提供的惡意代碼,早些年ARM處理器就引入了PXN(Privileged Execute Never)安全特性來緩解漏洞利用。雖然內(nèi)核不能直接執(zhí)行用戶態(tài)代碼,但可以直接訪問用戶態(tài)數(shù)據(jù)。利用一次寫內(nèi)核地址的機(jī)會,劫持內(nèi)核數(shù)據(jù)指針。在Android 7及以下的安卓終端上,一種常見的繞過PXN防御機(jī)制的方法如圖所示。
Android 8引入了PAN防御機(jī)制,使得內(nèi)核無法直接訪問用戶態(tài)數(shù)據(jù),上述繞過PXN防御機(jī)制的方法立即失效。
雖然多次觸發(fā)上述條件競爭漏洞將payload數(shù)據(jù)寫入內(nèi)核可以用于繞過PAN,但exploit代碼執(zhí)行成功率急劇下降。另外,借助其他內(nèi)核漏洞(eg: CVE-2017-13164)可以將數(shù)據(jù)穩(wěn)定寫入內(nèi)核,但在漏洞急劇減少的情況下,能否通過新的利用技巧同時繞過PXN和PAN防御機(jī)制,并獲取系統(tǒng)最高權(quán)限?借助ARM處理器的MMU硬件特性,答案是肯定的。
2. 內(nèi)核空間鏡像攻擊
Linux內(nèi)核經(jīng)典的三級頁表(PGD\PMD\PTE)布局和遍歷關(guān)系如下圖所示。
絕大多數(shù)的現(xiàn)代處理器已帶有地址管理單元MMU,上述虛擬地址轉(zhuǎn)換關(guān)系實際由其自動完成。ARM處理器也不例外,其通用的的地址轉(zhuǎn)換關(guān)系如圖所示。安卓系統(tǒng)采用三級頁表,Level 0頁表并未使用。
各級頁表中的描述符不僅包含了下一級起始物理地址,還包含了對這段內(nèi)存的訪問屬性。ARM有兩種描述符block和table。
最后一級頁表單獨(dú)表示。
上述頁表描述符中output address保存物理地址,兩端比特位保存內(nèi)存屬性信息。
內(nèi)存的執(zhí)行屬性由XN比特決定,PXN比特決定該內(nèi)存的代碼能否在內(nèi)核態(tài)執(zhí)行。而AP[2:1]兩比特的組合決定了內(nèi)存的讀寫權(quán)限。
其中,'01'組合比較奇怪。按照此種設(shè)計,該內(nèi)存能夠被用戶態(tài)和內(nèi)核態(tài)同時訪問,對應(yīng)的虛擬地址既可以是用戶地址,也可是內(nèi)核地址。如果某個內(nèi)核虛擬地址的訪問權(quán)限被設(shè)定為此組合,所有的普通應(yīng)用程序都能夠直接此內(nèi)核地址。顯然這個地址已超出任何普通應(yīng)用程序自身的地址范圍。由于虛擬地址空間的相互隔離,內(nèi)核地址對應(yīng)用程序本就不可見。而這個組合直接違反了二者隔離的安全設(shè)計,且操作系統(tǒng)內(nèi)核對此是無法感知的。
按照上述頁表遍歷的方式,修改任意內(nèi)核虛地址的訪問屬性需要內(nèi)核任意地址讀寫原語(Arbitray R/W Primitive),這個條件是非常強(qiáng)的。如果攻擊者已經(jīng)擁有了這種原語,可直接獲取系統(tǒng)最高權(quán)限。上述漏洞給予一次幾乎任意內(nèi)核地址寫入的機(jī)會,在此條件下,常規(guī)的頁表攻擊方式基本失效。
假設(shè)某臺安卓終端擁有3GB內(nèi)存。在沒有開啟內(nèi)核地址隨機(jī)化防御機(jī)制時,常見的一級頁表布局如下。
以"0xFFFFFFC000000000"起始的1GB內(nèi)核虛地址空間為例,內(nèi)核Image被加載到此范圍。內(nèi)核代碼段的訪問屬性是R-X,而內(nèi)核數(shù)據(jù)段的訪問屬性是RW-。因此,一級頁表描述符一定是TABLE類型。
64位內(nèi)核空間的虛擬地址絕大多數(shù)是無效的,比如"[0xFFFFFFC200000000,0xFFFFFFC23FFFFFFF]"范圍的地址都是無效的,其對應(yīng)的一級頁表項為空。假設(shè)此頁表項不為空,存在一個BLOCK類型的頁表項。其AP組合為'01',output address指向第一塊1GB的物理內(nèi)存,如圖所示。
通常情況下,“0xFFFFFFC03000200”內(nèi)核地址只能夠被內(nèi)核訪問。而此時,“0xFFFFFFC230002000”內(nèi)核地址能夠被用戶態(tài)和內(nèi)核態(tài)同時訪問。上述內(nèi)核虛地址訪問是同一塊物理內(nèi)存,二者的訪問權(quán)限可完全不同。即可實現(xiàn)代碼段在原有的虛擬地址范圍是R-X權(quán)限,而在鏡像虛擬地址范圍是RW-權(quán)限且能夠被所有的應(yīng)用程序所訪問。換句話說,內(nèi)核所運(yùn)行代碼都能被直接篡改,內(nèi)核層面的檢測根本無從談起。此時,根本不需要去獲取系統(tǒng)的最高權(quán)限,因為系統(tǒng)內(nèi)核代碼已經(jīng)完全可控,開啟真正的上帝模式。
結(jié)合上述漏洞,攻擊者已經(jīng)可以將一個用于開啟上帝模式的一級頁表項寫入到指定的位置,這個指定位置是需要精確計算的。Linux內(nèi)核一級頁表的起始地址保存在內(nèi)核數(shù)據(jù)段的swapper_pg_dir,那么頁表項的地址可以通過簡單公式計算。對于開啟內(nèi)核地址隨機(jī)化的系統(tǒng),只需修正swapper_pg_dir的真實地址即可。
swapper_pg_dir+ (Kernel_Mirroring_Base / 1G) * 8
至此,上帝模式已經(jīng)開啟。攻擊者可以運(yùn)行如下的攻擊代碼。這段攻擊代碼直接修改內(nèi)核數(shù)據(jù),patch內(nèi)核代碼。而對于普通C開發(fā)程序員或者Linux內(nèi)核開發(fā)人員來說,已經(jīng)違背了現(xiàn)代操作系統(tǒng)的常識,絕對是無稽之談。然而在上帝模式下,這段代碼就能真實的運(yùn)行。
在上帝模式下,攻擊者已經(jīng)可以在用戶態(tài)直接操作內(nèi)核,上述代碼的攻擊演示視頻(http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0),此時Android 8終端的PXN和PAN內(nèi)核防御機(jī)制已對攻擊者完全無效。完整地獲取Pixel 2XL手機(jī)的最高權(quán)限攻擊的視頻鏈接](http://v.youku.com/v_show/id_XMzU0MjA0NjY5Mg==.html?spm=a2h3j.8428770.3416059.1)。
3. 結(jié)尾
內(nèi)核空間鏡像攻擊除了能夠直接攻破安卓8重要的防御機(jī)制外,還能夠?qū)⒁恍┛此撇荒鼙焕?,危害評級較低的漏洞賦予重生的能力,典型的例子CVE-2017-0583。
同時,這個漏洞被Google作為有效防御的案例在zer0conf2017([Your Move: Vulnerability Exploitation and MitigationinAndroid](https://source.android.com/security/reports/zer0-conf-2017-Your-Move.pdf))上舉例。關(guān)于如何100%成功率的利用這個漏洞的相關(guān)內(nèi)容參看BlackHatAisa2018([KSMA: Breaking Android kernel isolation and Rooting with ARM MMUfeatures](https://www.blackhat.com/docs/asia-18/asia-18-WANG-KSMA-Breaking-Android-kernel-isolation-and-Rooting-with-ARM-MMU-features.pdf))的后部分內(nèi)容。
硬件設(shè)計的不合理危害性遠(yuǎn)高于軟件層面,且修補(bǔ)更新更為困難。在設(shè)計之初就將安全性作為一項重要的指標(biāo)是最佳的選擇。
值得一提的是,雖然這種攻擊技巧的危害很大,不過該技巧還是有很高的技術(shù)門檻的。我們希望硬件方案商和制造商能夠重視這個問題,并從硬件層面將其封堵掉。
在阿里安全潘多拉實驗室,類似于團(tuán)控這樣的白帽黑客還有很多。這些年輕人都出生于1990年前后,他們致力于從攻擊的視角去發(fā)現(xiàn)安全漏洞,并提出相應(yīng)的解決方案,以此來提升整個安全行業(yè)的安全水位。