阿里安全潘多拉實(shí)驗(yàn)室,主要聚焦于移動(dòng)安全領(lǐng)域有缆,包括對(duì)iOS和Android系統(tǒng)安全的攻擊和防御技術(shù)研究象踊。在今年3月的BlackHat Asia和4月份的HITB上,該實(shí)驗(yàn)室成員團(tuán)控(主攻方向?yàn)榘沧肯到y(tǒng)級(jí)漏洞的攻防研究)棚壁,受邀做了主題為《內(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)核空間和用戶空間擁有不同的頁(yè)表信息,并保存于不同的硬件寄存器熔酷。另外孤紧,內(nèi)核運(yùn)行時(shí)的特權(quán)等級(jí)高于用戶態(tài)程序,無(wú)論何時(shí)內(nèi)核空間對(duì)普通程序是不可見(jiàn)的拒秘。然而号显,ARM處理器的某些特殊硬件特性能夠打破這種保護(hù),使得普通程序在用戶態(tài)能夠直接訪問(wèn)內(nèi)核空間躺酒,直接打破內(nèi)核空間與用戶空間的隔離押蚤,修改內(nèi)核代碼,開(kāi)啟上帝模式羹应。
下文以安卓8終端為載體揽碘,介紹阿里安全潘多拉實(shí)驗(yàn)室成員研究并提出的內(nèi)核空間鏡像攻擊利用技巧。
二园匹、正文
1. 背景
2017年下钾菊,Google發(fā)布了Android 8(奧利奧)系統(tǒng)。新系統(tǒng)在安全方面引入了多種內(nèi)核安全加固特性偎肃,以對(duì)抗漏洞程序獲取手機(jī)的最高權(quán)限煞烫。其中,最為重要的安全特性就是PAN(Privileged Access Never)和KASLR(Kernel AddressSpace Layout Randomization)累颂≈拖辏可見(jiàn),利用一個(gè)漏洞來(lái)獲取眾多最新手機(jī)系統(tǒng)的最高權(quán)限是非常有挑戰(zhàn)性的紊馏。
在詳述內(nèi)核空間鏡像攻擊之前料饥,首先簡(jiǎn)單介紹ReVent通用ROOT方案。該方案基于@林雷雷(Aliaba Group)發(fā)現(xiàn)的一個(gè)linux內(nèi)核BUG朱监。
這個(gè)BUG存在與notification內(nèi)核系統(tǒng)調(diào)用:
[1]處計(jì)算文件名的長(zhǎng)度岸啡,并根據(jù)長(zhǎng)度在[2]分配相應(yīng)的存儲(chǔ)buffer,在[3]拷貝文件名字符串赫编。這個(gè)BUG在于巡蘸,從[1]到[3]的代碼路徑上,此文件能夠被重命名擂送,導(dǎo)致[3]發(fā)生內(nèi)核堆越界覆蓋悦荒。
通過(guò)巧妙的堆布局并覆蓋適合的內(nèi)核對(duì)象(eg: iovs),能夠?qū)⑵滢D(zhuǎn)化為在條件競(jìng)爭(zhēng)下嘹吨,幾乎任意內(nèi)核地址的一次寫操作搬味。堆布局實(shí)例如下:
為了向普通應(yīng)用程序提供服務(wù),用戶程序的地址空間對(duì)操作系統(tǒng)內(nèi)核是可見(jiàn)的。為了防止內(nèi)核直接執(zhí)行用戶程序提供的惡意代碼碰纬,早些年ARM處理器就引入了PXN(Privileged Execute Never)安全特性來(lái)緩解漏洞利用萍聊。雖然內(nèi)核不能直接執(zhí)行用戶態(tài)代碼,但可以直接訪問(wèn)用戶態(tài)數(shù)據(jù)悦析。利用一次寫內(nèi)核地址的機(jī)會(huì)寿桨,劫持內(nèi)核數(shù)據(jù)指針。在Android 7及以下的安卓終端上她按,一種常見(jiàn)的繞過(guò)PXN防御機(jī)制的方法如圖所示。
Android 8引入了PAN防御機(jī)制炕柔,使得內(nèi)核無(wú)法直接訪問(wèn)用戶態(tài)數(shù)據(jù)酌泰,上述繞過(guò)PXN防御機(jī)制的方法立即失效。
雖然多次觸發(fā)上述條件競(jìng)爭(zhēng)漏洞將payload數(shù)據(jù)寫入內(nèi)核可以用于繞過(guò)PAN匕累,但exploit代碼執(zhí)行成功率急劇下降陵刹。另外,借助其他內(nèi)核漏洞(eg: CVE-2017-13164)可以將數(shù)據(jù)穩(wěn)定寫入內(nèi)核欢嘿,但在漏洞急劇減少的情況下衰琐,能否通過(guò)新的利用技巧同時(shí)繞過(guò)PXN和PAN防御機(jī)制,并獲取系統(tǒng)最高權(quán)限炼蹦?借助ARM處理器的MMU硬件特性羡宙,答案是肯定的。
2. 內(nèi)核空間鏡像攻擊
Linux內(nèi)核經(jīng)典的三級(jí)頁(yè)表(PGD\PMD\PTE)布局和遍歷關(guān)系如下圖所示掐隐。
絕大多數(shù)的現(xiàn)代處理器已帶有地址管理單元MMU狗热,上述虛擬地址轉(zhuǎn)換關(guān)系實(shí)際由其自動(dòng)完成。ARM處理器也不例外虑省,其通用的的地址轉(zhuǎn)換關(guān)系如圖所示匿刮。安卓系統(tǒng)采用三級(jí)頁(yè)表,Level 0頁(yè)表并未使用探颈。
各級(jí)頁(yè)表中的描述符不僅包含了下一級(jí)起始物理地址熟丸,還包含了對(duì)這段內(nèi)存的訪問(wèn)屬性。ARM有兩種描述符block和table伪节。
最后一級(jí)頁(yè)表單獨(dú)表示光羞。
上述頁(yè)表描述符中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è)計(jì),該內(nèi)存能夠被用戶態(tài)和內(nèi)核態(tài)同時(shí)訪問(wèn)勘纯,對(duì)應(yīng)的虛擬地址既可以是用戶地址局服,也可是內(nèi)核地址。如果某個(gè)內(nèi)核虛擬地址的訪問(wèn)權(quán)限被設(shè)定為此組合驳遵,所有的普通應(yīng)用程序都能夠直接此內(nèi)核地址淫奔。顯然這個(gè)地址已超出任何普通應(yīng)用程序自身的地址范圍。由于虛擬地址空間的相互隔離堤结,內(nèi)核地址對(duì)應(yīng)用程序本就不可見(jiàn)唆迁。而這個(gè)組合直接違反了二者隔離的安全設(shè)計(jì),且操作系統(tǒng)內(nèi)核對(duì)此是無(wú)法感知的竞穷。
按照上述頁(yè)表遍歷的方式唐责,修改任意內(nèi)核虛地址的訪問(wèn)屬性需要內(nèi)核任意地址讀寫原語(yǔ)(Arbitray R/W Primitive),這個(gè)條件是非常強(qiáng)的瘾带。如果攻擊者已經(jīng)擁有了這種原語(yǔ)鼠哥,可直接獲取系統(tǒng)最高權(quán)限。上述漏洞給予一次幾乎任意內(nèi)核地址寫入的機(jī)會(huì)看政,在此條件下朴恳,常規(guī)的頁(yè)表攻擊方式基本失效。
假設(shè)某臺(tái)安卓終端擁有3GB內(nèi)存允蚣。在沒(méi)有開(kāi)啟內(nèi)核地址隨機(jī)化防御機(jī)制時(shí)于颖,常見(jiàn)的一級(jí)頁(yè)表布局如下。
以"0xFFFFFFC000000000"起始的1GB內(nèi)核虛地址空間為例嚷兔,內(nèi)核Image被加載到此范圍恍飘。內(nèi)核代碼段的訪問(wèn)屬性是R-X,而內(nèi)核數(shù)據(jù)段的訪問(wèn)屬性是RW-谴垫。因此章母,一級(jí)頁(yè)表描述符一定是TABLE類型。
64位內(nèi)核空間的虛擬地址絕大多數(shù)是無(wú)效的翩剪,比如"[0xFFFFFFC200000000,0xFFFFFFC23FFFFFFF]"范圍的地址都是無(wú)效的乳怎,其對(duì)應(yīng)的一級(jí)頁(yè)表項(xiàng)為空。假設(shè)此頁(yè)表項(xiàng)不為空前弯,存在一個(gè)BLOCK類型的頁(yè)表項(xiàng)蚪缀。其AP組合為'01',output address指向第一塊1GB的物理內(nèi)存恕出,如圖所示询枚。
通常情況下,“0xFFFFFFC03000200”內(nèi)核地址只能夠被內(nèi)核訪問(wèn)浙巫。而此時(shí)金蜀,“0xFFFFFFC230002000”內(nèi)核地址能夠被用戶態(tài)和內(nèi)核態(tài)同時(shí)訪問(wèn)刷后。上述內(nèi)核虛地址訪問(wèn)是同一塊物理內(nèi)存,二者的訪問(wèn)權(quán)限可完全不同渊抄。即可實(shí)現(xiàn)代碼段在原有的虛擬地址范圍是R-X權(quán)限尝胆,而在鏡像虛擬地址范圍是RW-權(quán)限且能夠被所有的應(yīng)用程序所訪問(wèn)。換句話說(shuō)护桦,內(nèi)核所運(yùn)行代碼都能被直接篡改含衔,內(nèi)核層面的檢測(cè)根本無(wú)從談起。此時(shí)二庵,根本不需要去獲取系統(tǒng)的最高權(quán)限贪染,因?yàn)橄到y(tǒng)內(nèi)核代碼已經(jīng)完全可控,開(kāi)啟真正的上帝模式催享。
結(jié)合上述漏洞杭隙,攻擊者已經(jīng)可以將一個(gè)用于開(kāi)啟上帝模式的一級(jí)頁(yè)表項(xiàng)寫入到指定的位置,這個(gè)指定位置是需要精確計(jì)算的睡陪。Linux內(nèi)核一級(jí)頁(yè)表的起始地址保存在內(nèi)核數(shù)據(jù)段的swapper_pg_dir寺渗,那么頁(yè)表項(xiàng)的地址可以通過(guò)簡(jiǎn)單公式計(jì)算匿情。對(duì)于開(kāi)啟內(nèi)核地址隨機(jī)化的系統(tǒng)兰迫,只需修正swapper_pg_dir的真實(shí)地址即可。
swapper_pg_dir+ (Kernel_Mirroring_Base / 1G) * 8
至此炬称,上帝模式已經(jīng)開(kāi)啟汁果。攻擊者可以運(yùn)行如下的攻擊代碼。這段攻擊代碼直接修改內(nèi)核數(shù)據(jù)玲躯,patch內(nèi)核代碼据德。而對(duì)于普通C開(kāi)發(fā)程序員或者Linux內(nèi)核開(kāi)發(fā)人員來(lái)說(shuō),已經(jīng)違背了現(xiàn)代操作系統(tǒng)的常識(shí)跷车,絕對(duì)是無(wú)稽之談棘利。然而在上帝模式下,這段代碼就能真實(shí)的運(yùn)行朽缴。
在上帝模式下善玫,攻擊者已經(jīng)可以在用戶態(tài)直接操作內(nèi)核,上述代碼的攻擊演示視頻(http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0)密强,此時(shí)Android 8終端的PXN和PAN內(nèi)核防御機(jī)制已對(duì)攻擊者完全無(wú)效茅郎。完整地獲取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ū)⒁恍┛此撇荒鼙焕孟等撸:υu(píng)級(jí)較低的漏洞賦予重生的能力,典型的例子CVE-2017-0583薪鹦。
同時(shí)掌敬,這個(gè)漏洞被Google作為有效防御的案例在zer0conf2017([Your Move: Vulnerability Exploitation and MitigationinAndroid](https://source.android.com/security/reports/zer0-conf-2017-Your-Move.pdf))上舉例惯豆。關(guān)于如何100%成功率的利用這個(gè)漏洞的相關(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è)計(jì)的不合理危害性遠(yuǎn)高于軟件層面涝开,且修補(bǔ)更新更為困難循帐。在設(shè)計(jì)之初就將安全性作為一項(xiàng)重要的指標(biāo)是最佳的選擇。
值得一提的是舀武,雖然這種攻擊技巧的危害很大拄养,不過(guò)該技巧還是有很高的技術(shù)門檻的。我們希望硬件方案商和制造商能夠重視這個(gè)問(wèn)題银舱,并從硬件層面將其封堵掉瘪匿。
在阿里安全潘多拉實(shí)驗(yàn)室,類似于團(tuán)控這樣的白帽黑客還有很多寻馏。這些年輕人都出生于1990年前后棋弥,他們致力于從攻擊的視角去發(fā)現(xiàn)安全漏洞,并提出相應(yīng)的解決方案诚欠,以此來(lái)提升整個(gè)安全行業(yè)的安全水位顽染。