Spectre attack lab

CPU的漏洞使得恶意程序能够破环进程间的保护机制(硬件)和进程内的保护机制(软件),从而使得而已程序徐能够从不允许访问的区域读取数据

task 1&2:Side Channel Attack via CPU Cache

使用CPU缓存来作为侧信道从而窃取信息

1

多次运行CacheTime,发现访问缓存的时间明显短于访问内存的时间,选择阈值为100

2

task2的原理就是,当一个秘密数据被访问的时候,它的缓存中应该有记录,那么之后进行重新加载数组的时候就可以得知

3

这里的数组空间还是有疑问

4

Task 3: Out-of-Order Execution and Branch Prediction

了解CPU当中的无需执行

无序执行是一种优化技术,它允许CPU最大化其所有执行单元的利用率。CPU不是严格按顺序处理指令,而是在所有所需资源可用时立即并行执行指令。当当前操作的执行单元被占用时,其他执行单元可以向前运行。

5

如果这种执行不应该发生,它们会消除无序执行对寄存器和内存的影响,因此执行不会导致任何可见的效果。然而,他们忘记了一件事,对CPU缓存的影响。在无序执行过程中,引用的内存被提取到寄存器中,并且也存储在缓存中。如果必须丢弃无序执行的结果,则还应丢弃由执行引起的缓存。不幸的是,这不是大多数CPU的情况。

程序先清除cache缓存,之后if来进行分支预测。当落到true的时候,通过reload来查看cache当中的条目

6

可以看到此时的secret被加载到了cache当中,说明这时候if分支会执行后面的语句

注释掉代码之后再次执行,会发现成功率很低,分析原因:

当注释掉之后,没有对clflush来清除size的缓存,此时victim当中的判断语句能够很快的从cache当中读取到size的值,也就很快能够确定应该执行哪个分支。所以,如果分支预测错误并且读取到的数据还没有加载到cache当中,此时攻击就会失败

7

改变victim参数为i + 20,发现成功率也是非常低的,这是由于在训练过程中总是会false,所以在之后选择的时候会选择false分支,也就不执行后续语句

8

Task 4: The Spectre Attack

如果机密数据在另一个进程中,则硬件级别的进程隔离可以防止进程从另一个进程窃取数据。如果数据处于同一进程中,则通常通过软件(如沙盒机制)进行保护。幽灵攻击可以针对这两种类型的秘密发起。

当在浏览器中打开来自不同服务器的网页时,它们通常是在同一个过程中打开的。浏览器内部实现的沙盒将为这些页面提供一个隔离的环境,因此一个页面将无法访问另一个页面的数据。大多数软件保护依赖于条件检查来决定是否应该授予访问权限。通过幽灵攻击,即使条件检查失败,我们也可以让CPU执行(无序的)受保护的代码分支,基本上破坏了访问检查。

9

10

Task 5: Improve the Attack Accuracy

可以观察到结果确实有一些噪声,并且结果并不总是准确的。这是因为CPU有时会在缓存中加载额外的值,希望在以后某个时候使用,或者阈值不是很准确。缓存中的噪声会影响我们的攻击结果。我们需要执行多次攻击;我们可以使用以下代码来自动执行任务,而不是手动执行。

编译运行SpectreAttackImproved,发现每次打印secret都是0

这是由于在调用restrictedAccess后,会根据返回结果访问相应的数据。而由于secret 存储在 buffer 外,所以 restrictedAccess 函数每次都会返回 0,所以每次都会访问 0 对应的数据, 使得 0 的 hit 次数最

修改代码,在查找分数最高的数据时,不包括 0

12

11

同时,修改unsleep(增大休眠时间)成功率会增加

Task 6: Steal the Entire Secret String

修改 main 函数,每次将 secret 指针移动 1B,依次打印出所有字节

14

13


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

meltdown lab 上一篇
生物技术实验报告 下一篇