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, 照样可以随便访问。因此重点是如果保护页表不被修改。


本文纯属个人观点.

猜你喜欢

转载自blog.csdn.net/weixin_39366778/article/details/80789547