Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

ASLR on the Line: Practical Cache Attacks on the MMU

论文下载

这篇文章发表在2017年NDSS上,作者是Vrije Universiteit Amsterdam的Ben Gras和Kaveh Razavi。文章中使用了一种EVICT+TIME的旁路攻击方式(AnC)来泄漏内存地址,用来降低ASLR的熵。项目网站:https://vusec.net/projects/anc

旁路攻击的条件比较苛刻,要求计时准确,内存访问的控制要求也很高,感觉应用上确实更适合浏览器攻击。

攻击原理

Fig

虚拟地址寻址时,会使用4级页表(PTL)来找到对应的物理地址。每级页表中存放指向下一级页表物理地址的PTE(Page Table Entry)。最后一级页表(PTL1)存放到目的物理地址的PTE。出于性能考虑,MMU和Cache中会缓存一部分最近经常访问的PTE,从而可以通过旁路攻击泄漏地址。

对64位的虚拟地址,12-20位确定PTL1中的PTE,21-29位确定PTL2中的PTE,30-38位确定PTL3中的PTE,39-46位确定PTL4中的PTE。64位系统中ASLR随机化了最多35bit熵,即虚拟地址的12-45位是随机的。

攻击时通过分配多个内存地址上连续(或者临近)的内存块,来暴破待泄漏内存地址的偏移。由于PTL对应的虚拟地址的分段特性,可以分配不同大小的内存块分段暴破。 攻击前需要清空cache中的PTE的缓存,通过多次访问一个偏远的内存空间来清cache。然后访问待泄漏的内存地址,因为cache已经清掉了,所有会进行一次Page Table Walk,目标虚拟地址对应的四级PTL都会装入cache。这时候再访问预先分配的相邻(或者临近)的内存块中的地址,并记录时间。因为,这两个内存块的虚拟地址高位都一样,只有低位不同,因此可以通过(比如)PTL1的cache miss来旁路泄漏出目标地址的偏移。然后逐次访问更远的内存,来泄漏更高位的(e.g. PTL4)的地址。

Challenge

  1. 准确测量时间:Firefox上用performance.now() 计时,精度是每5µs一次;chrome上因为performance.now()不太准,所以用shared memory counter来计时。
  2. 内存排列:以2GB为单位分配内存块。使用不同的步长来分段泄漏地址。使用步长4KB来泄漏PTL1,2MB泄漏PTL2,8GB泄漏PTL3,4TB泄漏PTL4。浏览器中,Firefox因为mmap的时候没有用MAP_POPULATE,所以可以顺利地分配到4TB的内存。但在Chrome中,mmap的时候会同时分配物理内存,所以攻击PTL3和PTL4时会有一定概率无法成功。

实验

作者在实验中对Chrome和Firefox进行了攻击。实验环境是Intel Skylake i7- 6700K CPU, 16 GB 内存,操作系统是 Ubuntu 16.04.1 LTS

Fig

上图攻击是成功率的图,Chrome因为内存排列随机化的原因,会有失败的概率。Firefox PTL4攻击时,4TB内存会和其他对象共享,产生噪声。

Fig

上图中,AnC攻击可以在50s内有效地降低ASLR的熵。

Fig

上表列举了可以被AnC攻击的CPU型号。

防御方法

攻击检测

可以针对攻击者使用的计时器进行检测防御,但是有可能有误报。

Cache分区

可以对每个程序划分LLC(Last Level Cache)进行进程隔离,防止其他进程受到攻击。但是这种方法可能会对计算机系统带来性能上的影响。

计时器修改

可以降低计时器的精度,来防止攻击者进行旁路信息收集。但是问题是,攻击者有很多其他的手段来构造出计时器,进行攻击。无法完全防御所有的计时器。

Cache隔离

可以加一个独立的cache把PTE都放进去,阻止旁路信息泄漏。但是这样的问题在于成本太高。