Rowhammer比特翻转攻击是指利用临近内存单元之间电子的互相影响,在足够多的访问次数后让某个单元的值从1变成0,反之亦然。这种攻击可以在不访问目标内存区域的前提下使其产生数据错误。
这次的攻击与操作系统和软件无关,纯粹是硬件上的漏洞导致的
double-sided/single-sided
DRAM原理理解参考文献:
http://wenku.baidu.com/link?url=17FnQIwXcot996j2bLCKr5BOegjhH4cmnWxwS6hF6Nskc_tKZxVqZQ4MmokSJxAKX9K6rpjubTkSRSPMwiKrz9W3FauZjqKLmWjAD82Qxv3
刷新:先读再写,把一行数据读出来,然后再重新写进入,完成一次刷新。DRAM存储元是通过栅极电容存储电荷来暂存信息,而电容中的电荷是会泄漏的,所以需要刷新。
- 读取潜伏期性能检测设施(Load Latency performance monitoring facility ):是Intel的PEBS(Performance Event Base Sampling)的一部分。通过这个设施来实现对末级Cache缺失的采样。然后写成PEBS记录,可供软件访问
- Precise Store Facility:使ANVIL实现对旧处理器的向下兼容。
- 末级Cache缺失计数设施(the last-level cache miss counter facility):当在规定的时间内出现N次缺失,就发出一次中断。这时我们就知道末级Cache缺失率超过了阈值。
背景:什么是Rowhammer Attack?
三种实现Rowhammer Attack的方式
- single-sided with CLFLUSH
- double-sided with CLFLUSH
- double-sided without CLFLUSH
类型/类型 | Single-Sided | Double-Sided |
---|---|---|
CLFLUSH-base | Single-Sided with CLFLUSH | Double-Sided with CLFLUSH |
CLFLUSH-free | 无 | Double-Sided without CLFLUSH |
表格:Rowhammer攻击的方式分类
- Single-Sided:多次访问一行,对周围的两行造成影响
- Double-Sided:多次访问两行,对该两行包围的一行造成影响
- CLFLUSH-base:使用CLFLUSH指令,通过清空缓存线,实现对内存行的访问
- CLFLUSH-free:不使用CLFLUSH指令,通过其他方式,实现对内存行的访问
Rowhammer攻击实现
1. Single-Sided/Double-Sided with CLFLUSH:
- CLFLUSH:使包缓存线失效,目的是将缓存的数据写入内存
//这样一段代码就能引起位翻转,形成Rowhammer攻击
code1a:
mov (X), %eax // Read from address X
mov (Y), %ebx // Read from address Y
clflush (X) // Flush cache for address X
clflush (Y) // Flush cache for address Y
jmp code1a
2. Double-Sided without CLFLUSH:
具体工作:
环境:Intel core i5-2540M processor (Sandy Bridge),三级缓存,12-way(12路组相连映射)
确定回收集(eviction set):冲突地址(conflicting address)和侵略者地址 (aggressor address)。物理地址的6到16位用来做内存和cache的映射。由此可以确定一些冲突地址。由同属于一个组的这些冲突地址和一个侵略者地址构成一个回收集:(A0,X1,X2……X11)。
确定Cache替换策略:Bit Pseudo-LRU (Bit-PLRU),该算法是对LRU(最近最早使用)算法的改进。通过实验,构造一个高缺失率的pattern,通过“实际结果”和“其他算法的结果”作比较。发现和Bit Pseudo-LRU (Bit-PLRU)算法的实验结果和真实结果比较接近。
构造访问序列:
A0(row0,setx) X1(setx) X2(setx)…… X9(setx) X10(setx)
X11(setx) X1(setx) X2(setx)…… X9(setx) X10(setx)
.
A0(row0,setx) X1(setx) X2(setx)…… X9(setx) X10(setx)
X11(setx) X1(setx) X2(setx)…… X9(setx) X10(setx)
……
说明:A0对应Row0,映射到组X中。然后访问同属于组X的冲突地址X1,X2……X10。此时根据Cache替换策略,A0处于最近最少使用的位置。当访问X11时,A0被替换出去。这样Row0就会被访问一次。接下来继续访问同属于组X的冲突地址X1,X2……X10。最后X11会处于最近最少使用位置。
当第二遍访问A0时,X11被替换出去。
像这样周而复始,按照上述序列重复进行N次,即可以实现重复N次访问Row0的效果。
同样的道理,对Row2进行相同的操作,也可以实现重复N次访问Row2的效果。
根据序列进行访问的过程是关键
通过上述过程,可以实现对Row0和Row2的重复访问,就可以在不使用CLFLUSH指令的情况下,进行Rowhammer攻击。
Rowhammer攻击的代价
图:Rowhammer攻击的代价,即时间开销
实验环境:Ubuntu操作系统, Sandy Bridge为体系结构, 4GB DDR3的笔记本电脑
现在常用的两种应对方法:
- 把DRAM的刷新率提高一倍;
- 禁用清空Cache的指令,比如CLFLUSH指令。
但是,这两种措施并不是有效的。因为第一种方法并不能防范double-sided with CLFLUSH类型的攻击。对于第二种方法,即使不使用CLFLUSH指令,也能进行Rowhammer攻击。
补充:
Cache的基本知识:
- Inclusive/Exclusive
- Inclusive:L1 Cache是L2 Cache的子集,即L1的内容是L2内容的复制
- Exclutive:L1和L2的数据不重合
- 12-way(或者8-way等)
- 12路组相连:内存的物理地址映射到Cache中的方式(教科书中的映射方式有三种,还记得吗?)