一、前言
在現代操作系統中,系統運行的內核空間和應用程序的用戶空間相互隔離,以保證操作系統的穩定性。以運行Linux內核的ARM終端為例,內核空間和用戶空間擁有不同的頁表信息,并保存于不同的硬件寄存器。另外,內核運行時的特權等級高于用戶態程序,無論何時內核空間對普通程序是不可見的。然而,ARM處理器的某些特殊硬件特性能夠打破這種保護,使得普通程序在用戶態能夠直接訪問內核空間,直接打破內核空間與用戶空間的隔離,修改內核代碼,開啟上帝模式。下文以安卓8終端為載體,介紹阿里安全潘多拉實驗室成員研究并提出的內核空間鏡像攻擊利用技巧。
二、正文
1. 背景
2017年下,Google發布了Android 8(牛軋糖)系統。新系統在安全方面引入了多種內核安全加固特性,以對抗漏洞程序獲取手機的最高權限。其中,最為重要的安全特性就是PAN(Privileged Access 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硬件特性,答案是肯定的。
2. 內核空間鏡像攻擊
Linux內核經典的三級頁表(PGD\PMD\PTE)布局和遍歷關系如下圖所示。
絕大多數的現代處理器已帶有地址管理單元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內核開發人員來說,已經違背了現代操作系統的常識,絕對是無稽之談。然而在上帝模式下,這段代碼就能真實的運行。
3. 結尾
內核空間鏡像攻擊除了能夠直接攻破安卓8重要的防御機制外,還能夠將一些看似不能被利用,危害評級較低的漏洞賦予重生的能力,典型的例子CVE-2017-0583。
同時,這個漏洞被Google作為有效防御的案例在zer0conf2017上舉例。關于如何100%成功率的利用這個漏洞的相關內容參看BlackHatAisa2018 的后部分內容。
硬件設計的不合理危害性遠高于軟件層面,且修補更新更為困難。在設計之初就將安全性作為一項重要的指標是最佳的選擇。
1024你懂的国产日韩欧美_亚洲欧美色一区二区三区_久久五月丁香合缴情网_99爱之精品网站
責任編輯:韓希宇
免責聲明:
中國電子銀行網發布的專欄、投稿以及征文相關文章,其文字、圖片、視頻均來源于作者投稿或轉載自相關作品方;如涉及未經許可使用作品的問題,請您優先聯系我們(聯系郵箱:cebnet@cfca.com.cn,電話:400-880-9888),我們會第一時間核實,謝謝配合。