Rowhammer

来源:互联网 发布:html打赏视频源码 编辑:程序博客网 时间:2024/06/05 17:04

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的方式

  1. single-sided with CLFLUSH
  2. double-sided with CLFLUSH
  3. 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攻击的方式分类

  1. Single-Sided:多次访问一行,对周围的两行造成影响
  2. Double-Sided:多次访问两行,对该两行包围的一行造成影响
  3. CLFLUSH-base:使用CLFLUSH指令,通过清空缓存线,实现对内存行的访问
  4. 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:

Rowhammer攻击流程示意图

具体工作:

  • 环境: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攻击的代价
图:Rowhammer攻击的代价,即时间开销
实验环境:Ubuntu操作系统, Sandy Bridge为体系结构, 4GB DDR3的笔记本电脑

现在常用的两种应对方法:

  1. 把DRAM的刷新率提高一倍;
  2. 禁用清空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中的方式(教科书中的映射方式有三种,还记得吗?)

0 0
原创粉丝点击