微信公众号 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, 照样可以随便访问。因此重点是如果保护页表不被修改。
本文纯属个人观点.