Hacking arm PAN?
微信公眾號 mindshare思享
最近有文章說阿里潘多拉實驗室利用了arm構架的上帝模式hack了Android Linux系統,其中重要一點是利用了armv8構架裡新定義的PAN(Privilege Access Never)的漏洞。本人十分欽佩國內騰訊科恩,Ali潘多拉團隊,他們的能力非常之強。
本文從構架的角度探討一下這次PAN攻擊。限於本人能力,如果有理解不對的地方,請斧正。
首先,說一下PAN在arm 構架裡的定義,請參照arm architecture referencemanual.
.
About the PAN bit. Whenthe value of PSTATE.PAN is 1, any privilegeddata access from EL1 or EL2 to a virtual memory address that is accessible atEL0 generates a Permission fault.
當PSTATE的PAN設定為1時,CPU處於EL1或EL2時,對那些EL0有訪問許可權(包括讀寫)的虛擬記憶體進行特權資料訪問(EL1/EL2時資料訪問都是特權資料訪問)會導致訪問許可權異常。
根據AP[2:1]的定義
. The AP[2:1] data access permissions, for stage 1 translations
In VMSAv8-64, for a translation regimethat applies to both EL0 and a higher Exception level, the AP[2:1] bits controlthe stage 1 data access permissions, and:
. AP[2]
Selectsbetween read-only and read/write access.. AP[1] Selectsbetween Application level (EL0) control and the higher Exception level control.
再對照構架文件裡對許可權檢查的虛擬碼,
其中關鍵的是,
user_r = perms.ap<1> == '1';
if (HavePANExt() && PSTATE.PAN == '1'&& user_r && ispriv && !(acctype IN {AccType_DC,AccType_AT,AccType_IFETCH}) || (acctype == AccType_AT && AArch64.ExecutingATS1xPInstr()))then priv_r = FALSE; priv_w = FALSE;
上面程式碼基本意思是,如果
1. PAN功能使能,PSTATE.PAN==1
2. user_r=AP[1]==1
3. 對這個地址的訪問不是data cache maintenance,指令預取,或是某些地址轉換指令AT導致的。
那麼,設定成priviledge no access (no read, no write).
由上面分析,本人認為在“把第一級頁表改成AP[2:1]的上帝模式”並不能bypass PAN的檢查。不太理解Ali文中是如何利用PAN開啟上帝模式的,也許我對Ali文理解有偏差,如果是的話,請指正。
另外,如果kernel的MMU頁表可以被修改,則完全不需要PAN,只要將VA map到想訪問的大塊PA(output PA address),再把PTE或是PMD修改成user RW, 照樣可以隨便訪問。因此重點是如果保護頁表不被修改。
本文純屬個人觀點.