3

在幽灵漏洞描述文件中,我们可以看到它谈到了这个特定的漏洞。

if (x < array1_size)
   y = array2[array1[x] * 256];

根据论文,在幽灵漏洞中,他们首先为 x 传递许多合法值,以便分支预测器得到训练并开始推测下一条语句,即开始执行y = array2[array1[x] * 256];。并且经过足够长的迭代,当分支预测器被训练时,x 的恶意值被传递,在这种情况下,处理器开始推测执行y = array2[array1[x] * 256];,这一次它加载array1[x]到缓存中,目前无法恢复,可以被攻击者使用。通道攻击。

所以我的问题是为什么我们也需要有这个if声明。如果只有这句话

   y = array2[array1[x] * 256];

上面的这个语句(没有if)是否应该足以将其加载array1[x]到缓存中。为什么我们甚至需要这个if声明?

4

2 回答 2

0

为什么我们甚至需要这个 if 语句?

我们需要if语句来 1)创建一个时间窗口,所以攻击是可能的 2)避免程序崩溃。

为攻击创建时间窗口

的主要目的if是创建一个时间窗口。为了让它发生,array1_size不能在缓存中。

一旦我们到达if语句,CPU 等待array1_size从主内存加载。同时,分支预测器说“采取分支”并且推测执行继续进行,访问外部数据array1并对array2.

array1_size如果它们在缓存中,这是不可能的。实际上,CPU 会很快意识到x超出范围并中止推测执行。

避免崩溃

当我们训练分支时,所有的x值都在array1. 但是一旦我们想读取外部的数据array1(即读取一个秘密),我们就会传递一个巨大的、超出范围的x. 如果我们无法访问该内存(即内存在内核空间中),我们的程序将因Segmentation Fault错误或类似错误而崩溃。

CPU 在推测执行期间屏蔽任何错误,直到指令实际退出。if确保无效的指令永远x不会被淘汰。一旦 CPU 意识到推测出错,它们只会产生副作用并被刷新。

简单示例

这是我的基于 Spectre 的 Meltdown 攻击(即 2 合 1)的简单示例:https ://github.com/berestovskyy/spectre-meltdown

IMO 它比 Specre 论文中的原始代码更简单、更容易理解。它在 C 语言中只有 99 行(包括注释)。

于 2018-03-06T08:37:11.183 回答
0

数组访问总是受到边界检查的限制,没有这个边界检查,这是一个正常的缓冲区溢出编程BUG,可以很容易地利用而不使用推测执行。

于 2018-10-29T09:34:18.357 回答