1. 程式人生 > >Hacking arm PAN?

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.

PSTATEPAN設定為1時,CPU處於EL1EL2時,那些EL0有訪問許可權(包括讀寫)的虛擬記憶體進行特權資料訪問(EL1/EL2時資料訪問都是特權資料訪問)會導致訪問許可權異常。


根據AP2: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, 照樣可以隨便訪問。因此重點是如果保護頁表不被修改。


本文純屬個人觀點.