@1qaz
2016-11-24T18:29:13.000000Z
字数 2030
阅读 1217
rowhammer
Victor van der Veen,Yanick Fratantonio,Daniel Gruss et al.
Vrije Universiteit Amsterdam , CCS'16
一句话:Deterministic rowhammer on android!
之前rowhammer的攻击要么是概率性的(ProjectZero),要么需要特殊的内存管理特性(KSM,THP)来把victim 数据放到会flip的物理地址上。这篇文章提出了利用android的内存管理接口来进行确定性的rowhammer攻击技术,不需要软件漏洞和权限的情况下进行root
DRAM:row,rowbuffer,bank,refresh
Double-sided rowhammer: sandwich
000000000
111111111
000000000
攻击的基本条件:
1. Fast uncached memory access:必须,bypass the cache
2. Physical memory massaging:把victim 数据放到会flip的物理地址上 确定性 最有难度的一步
3. Physical memroy address:非必须,需要连续的物理地址来做double-sided rowhammer
rowhARMer
android内核模块,ARM中的DCCIMVAC指令(类似x86中的clflush,但是需要root权限)
x86上实现3个利用条件的方式:
P1:Fast uncached memory access
* 直接清cache:clflush
* cache eviction set:不同地址映射到同一个cache line (rowhammer.js)
* 非暂存的访问指令:不使用cache的内存访问操作
P2:Physical memory massaging
* Page-table spraying
* Memory duplication
* MMU paravirtualization
P3:Physical memroy address
* Pagemap interface
* Huge pages
确定rowsize:时间旁路,同时访问page n和page n+i,当n+i位于下一个row时,n和n+i位于同一个bank中,第二次访问需要清空rowbufer,时间更长。(没有文档和工具)
DMA buffer management:让用户空间的程序访问外设的内存(用户控制cache,物理连续),解决了P1和P3
Physical memory massaging:
整体思路:建立模板,利用物理内存分配器行为的可预测性,耗尽不同大小的连续物理块,从攻击者可以预测的地址开始分配内存
buddy allocator,slab
L chunk:slab largest chunk size,4k*2^10 = 4MB
M chunk:row size, 32k/64K
S chunk:page size, 4k
step2->step3:释放L*
step4->step5:释放M*
step6:不断消耗S chunk,S至M/2大小的chunk都会被用掉,一定会有一个落在刚刚释放出来的M*中。这里消耗S chunk就是不断mmap,产生页表项。
判断是否达到临界条件:/proc/zoneinfo,/proc/pagetypeinfo
exploit:
页表指向自身,写页表,任意地址读写
0->1,1—>0 不能超出攻击者的控制范围
不可利用的flip:
1. 位于page的后半部分 (ARM shadow pagetable)
2. 位于32bit word的低12bit,PTE,页内偏移
3. 位于32bit word的高11bit,L=4M时L中有512=2^9个页
一个页中可以利用的flip bit大约为7%
android ion memory ,/dev/ion,用户空间获得uncached、物理连续的内存
减少其他程序的干扰
Root Privilege Escalation
寻找内核空间中的struct cred,并比较是否是攻击者进程的,通过访问不同page来刷TLB
大约需要20s
已有的措施:
硬件:ECC,LPDDR4 Target Row Refresh
软件:
* 禁止cache有关指令 clflush
* 封掉物理地址接口 pagemap
针对drammer的方法:
* 限制用户空间的接口:google倾向于让设备提供商的代码运行在用户空间而不是kernel,限制ioctl
* 隔离DMA的内存和其他内存:ION使得用户在ZONE_LOWMEM分配内存,而ZONE_LOWMEM通常是被kernel和pagetable使用的