內核空間鏡像攻擊|利用ARM MMU硬體特性開啟安卓8終端的上帝模式
來自專欄安全客
編者按:團控,阿里安全潘多拉實驗室研究人員,該實驗室主要聚焦於移動安全領域,包括對iOS和Android系統安全的攻擊和防禦技術研究。團控的主攻方向為安卓系統級漏洞的攻防研究。在今年3月的BlackHat
Asia和4月份的HITB上,團控受邀做了主題為《內核空間鏡像攻擊》的演講。以下為團控該研究主題的技術分析文章。一、前言
在現代操作系統中,系統運行的內核空間和應用程序的用戶空間相互隔離,以保證操作系統的穩定性。以運行Linux內核的ARM終端為例,內核空間和用戶空間擁有不同的頁表信息,並保存於不同的硬體寄存器。另外,內核運行時的特權等級高於用戶態程序,無論何時內核空間對普通程序是不可見的。然而,ARM處理器的某些特殊硬體特性能夠打破這種保護,使得普通程序在用戶態能夠直接訪問內核空間,直接打破內核空間與用戶空間的隔離,修改內核代碼,開啟上帝模式。下文以安卓8終端為載體,介紹阿里安全潘多拉實驗室成員研究並提出的內核空間鏡像攻擊利用技巧。
二、正文
背景
2017年下,Google發布了Android
8(奧利奧)系統。新系統在安全方面引入了多種內核安全加固特性,以對抗漏洞程序獲取手機的最高許可權。其中,最為重要的安全特性就是PAN(PrivilegedAccess Never)和KASLR(Kernel Address Space Layout
Randomization)。可見,利用一個漏洞來獲取眾多最新手機系統的最高許可權是非常有挑戰性的。在詳述內核空間鏡像攻擊之前,首先簡單介紹ReVent通用ROOT方案。該方案基於@林雷雷(Aliaba Group)發現的一個linux內核BUG。
這個BUG存在與notification內核系統調用:
[1]處計算文件名的長度,並根據長度在[2]分配相應的存儲buffer,在[3]拷貝文件名字元串。這個BUG在於,從[1]到[3]的代碼路徑上,此文件能夠被重命名,導致[3]發生內核堆越界覆蓋。
通過巧妙的堆布局並覆蓋適合的內核對象(eg: iovs),能夠將其轉化為在條件競爭下,幾乎任意內核地址的一次寫操作。堆布局實例如下:為了向普通應用程序提供服務,用戶程序的地址空間對操作系統內核是可見的。為了防止內核直接執行用戶程序提供的惡意代碼,早些年ARM處理器就引入了PXN(Privileged
Execute Never)安全特性來緩解漏洞利用。雖然內核不能直接執行用戶態代碼,但可以直接訪問用戶態數據。利用一次寫內核地址的機會,劫持內核數據指針。在Android 7及以下的安卓終端上,一種常見的繞過PXN防禦機制的方法如圖所示。Android 8引入了PAN防禦機制,使得內核無法直接訪問用戶態數據,上述繞過PXN防禦機制的方法立即失效。
雖然多次觸發上述條件競爭漏洞將payload數據寫入內核可以用於繞過PAN,但exploit代碼執行成功率急劇下降。另外,藉助其他內核漏洞(eg:CVE-2017-13164)可以將數據穩定寫入內核,但在漏洞急劇減少的情況下,能否通過新的利用技巧同時繞過PXN和PAN防禦機制,並獲取系統最高許可權?藉助ARM處理器的MMU硬體特性,答案是肯定的。
內核空間鏡像攻擊
Linux內核經典的三級頁表(PGDPMDPTE)布局和遍歷關係如下圖所示。
絕大多數的現代處理器已帶有地址管理單元MMU,上述虛擬地址轉換關係實際由其自動完成。ARM處理器也不例外,其通用的的地址轉換關係如圖所示。安卓系統採用三級頁表,Level 0頁表並未使用。各級頁表中的描述符不僅包含了下一級起始物理地址,還包含了對這段內存的訪問屬性。ARM有兩種描述符block和table。
最後一級頁表單獨表示。
上述頁表描述符中output address保存物理地址,兩端比特位保存內存屬性信息。
內存的執行屬性由XN比特決定,PXN比特決定該內存的代碼能否在內核態執行。而AP[2:1]兩比特的組合決定了內存的讀寫許可權。
其中,』01』組合比較奇怪。按照此種設計,該內存能夠被用戶態和內核態同時訪問,對應的虛擬地址既可以是用戶地址,也可是內核地址。如果某個內核虛擬地址的訪問許可權被設定為此組合,所有的普通應用程序都能夠直接此內核地址。顯然這個地址已超出任何普通應用程序自身的地址範圍。由於虛擬地址空間的相互隔離,內核地址對應用程序本就不可見。而這個組合直接違反了二者隔離的安全設計,且操作系統內核對此是無法感知的。
按照上述頁表遍歷的方式,修改任意內核虛地址的訪問屬性需要內核任意地址讀寫原語(Arbitray R/W
Primitive),這個條件是非常強的。如果攻擊者已經擁有了這種原語,可直接獲取系統最高許可權。上述漏洞給予一次幾乎任意內核地址寫入的機會,在此條件下,常規的頁表攻擊方式基本失效。假設某台安卓終端擁有3GB內存。在沒有開啟內核地址隨機化防禦機制時,常見的一級頁表布局如下。
以」0xFFFFFFC000000000」起始的1GB內核虛地址空間為例,內核Image被載入到此範圍。內核代碼段的訪問屬性是R-X,而內核數據段的訪問屬性是RW-。因此,一級頁表描述符一定是TABLE類型。
64位內核空間的虛擬地址絕大多數是無效的,比如」[0xFFFFFFC200000000,
0xFFFFFFC23FFFFFFF]」範圍的地址都是無效的,其對應的一級頁表項為空。假設此頁表項不為空,存在一個BLOCK類型的頁表項。其AP組合為』01』,output address指向第一塊1GB的物理內存,如圖所示。通常情況下,「0xFFFFFFC03000200」內核地址只能夠被內核訪問。而此時,「0xFFFFFFC230002000」內核地址能夠被用戶態和內核態同時訪問。上述內核虛地址訪問是同一塊物理內存,二者的訪問許可權可完全不同。即可實現代碼段在原有的虛擬地址範圍是R-X許可權,而在鏡像虛擬地址範圍是RW-許可權且能夠被所有的應用程序所訪問。換句話說,內核所運行代碼都能被直接篡改,內核層面的檢測根本無從談起。此時,根本不需要去獲取系統的最高許可權,因為系統內核代碼已經完全可控,開啟真正的上帝模式。
結合上述漏洞,攻擊者已經可以將一個用於開啟上帝模式的一級頁表項寫入到指定的位置,這個指定位置是需要精確計算的。Linux內核一級頁表的起始地址保存在內核數據段的swapper_pg_dir,那麼頁表項的地址可以通過簡單公式計算。對於開啟內核地址隨機化的系統,只需修正swapper_pg_dir的真實地址即可。
swapper_pg_dir + (Kernel_Mirroring_Base / 1G) * 8至此,上帝模式已經開啟。攻擊者可以運行如下的攻擊代碼。這段攻擊代碼直接修改內核數據,patch內核代碼。而對於普通C開發程序員或者Linux內核開發人員來說,已經違背了現代操作系統的常識,絕對是無稽之談。然而在上帝模式下,這段代碼就能真實的運行。
在上帝模式下,攻擊者已經可以在用戶態直接操作內核,上述代碼的攻擊演示視頻(http://v.youku.com/v_show/id_XMzY0NjU3MTA1Mg==.html?spm=a2hzp.8244740.0.0),此時Android 8終端的PXN和PAN內核防禦機制已對攻擊者完全無效。完整地獲取Pixel 2XL手機的最高許可權攻擊的視頻鏈接](http://v.youku.com/v_show/id_XMzU0MjA0NjY5Mg==.html?spm=a2h3j.8428770.3416059.1)。
結尾
內核空間鏡像攻擊除了能夠直接攻破安卓8重要的防禦機制外,還能夠將一些看似不能被利用,危害評級較低的漏洞賦予重生的能力,典型的例子CVE-2017-0583。
同時,這個漏洞被Google作為有效防禦的案例在zer0conf2017(Your Move: Vulnerability Exploitation and Mitigation in Android)上舉例。關於如何100%成功率的利用這個漏洞的相關內容參看BlackHatAisa2018(KSMA: Breaking Android kernel isolation and Rooting with ARM MMU features)的後部分內容。
硬體設計的不合理危害性遠高於軟體層面,且修補更新更為困難。在設計之初就將安全性作為一項重要的指標是最佳的選擇。推薦閱讀:
※arm晶元用pcie匯流排是不是能提高數據傳輸性能和效率?
※為什麼英偉達Tegra X1晶元不採用丹佛架構?
※可以使用USB2.0介面進行全雙工通訊么,雙方都可以主動發送么?
※ARM CEO:物聯網市場爆發的1000億枚晶元將采ARM設計
※「高通晶元 + Android = 音質缺陷」的說法在今天看來仍然如此嗎?