Spectre示例

4
在《Spectre 论文》中,有一个利用越界数组访问的例子(第1.2节)。代码如下:
if (x < array1_size)
  y = array2[ array1[x] * 256 ];

该过程是使用一些有效的x值来训练正确的路径。然后提供一个无效的x值,并同时假定array1_size未缓存。由于分支预测器认为条件为真,它将推测地获取array2的偏移量。
现在,问题来了。在推测执行中,必须获取array1[x],其中x是恶意的并且越界。因此,array1[x]实际上是无效的!那么攻击是什么?没有获取到有效数据!
有人能解释一下吗?这里有什么误解?

我认为你在那个话题中的回答与我的问题没有直接关系。我想知道的是越界异常。假设一个数组有10个项目,范围是0..9。现在CPU会猜测性地从索引8获取一些项目。这些项目是9、10、11、12。array1[10]是无效的,应该在发生附加之前抛出异常。不是这样吗? - mahmood
1
在下面做了一个回答。 (此处更详细地说明了投机攻击)。投机执行的代码不会引发异常(否则像C语言中的if(arr [x]!= NULL)* arr [x] = 3;这样的代码,当xNULL时,* arr [x] = 3可以被投机性地运行,会触发一个异常,该用户不应该获得,因为分支条件最终将评估为* false *,并且投机运行的代码未被弃用。 - Déjà vu
3个回答

4

因此,array1[x]实际上是无效的!那么攻击是什么?!没有获取有效数据!

这就是攻击的主要问题。索引(即x)可能非常大,因此我们能够访问不应该访问的数据。

例如,如果我们的代码在JavaScript沙箱或Java虚拟机中,我们将能够访问沙箱/虚拟机之外的数据。

更进一步,推测执行可能会访问内核页面,即我们无权访问的页面。这就是Meltdown。

这是我基于Spectre的Meltdown概念验证,仅用99行代码,您可能会更容易理解:

https://github.com/berestovskyy/spectre-meltdown


如果没有cflush命令,如何实现Spectre攻击?例如,是否可以使用Evict+Reload?我似乎没有看到有人在github上成功地用Evict+Reload替换了flush-reload?如果我使用Evict+Reload,每次都需要清除整个缓存中的所有缓存行吗? - Gerrie

1
"Spectre(与Metldown不同)的工作原理在于CPU如何处理分支预测。从您提到的同一篇论文中,[2.3]推测执行要求处理器猜测分支指令的可能结果。更好的预测通过增加成功提交的推测执行操作的数量来提高性能。
(...)
为了预测条件分支是否被接受,处理器维护最近分支结果的记录。然后,[4]代码片段以对进行边界检查开始,这对于安全至关重要。特别地,此检查防止处理器读取之外的敏感内存。否则,越界输入可能会触发异常或通过提供导致处理器访问敏感内存。但是,该论文继续解释了为什么这仍然可能起作用,而不会触发异常:"
不幸的是,在推测执行期间,边界检查的条件分支可能会跟随错误的路径。例如,假设攻击者使代码运行如下: • 恶意选择x的值(越界),使array1[x]解析为受害者内存中的秘密字节k; • array1大小和array2不在处理器缓存中,但k已被缓存;和 • 先前的操作收到了有效的x值,导致分支预测器假设if将很可能为真。
最后,CPU在评估x值过高后,将有效地绕过if主体,并且不会撤回检索的y值。然而,缓存状态已经改变,这就是攻击发生的地方:
处理器意识到其预测执行出现错误,并回滚其寄存器状态。但是,在实际处理器上,从array2进行的推测性读取会以地址特定的方式影响缓存状态,其中地址取决于k
在推测代码执行期间进行了对array1[x]的未授权访问,因此不会引发异常,因为CPU“知道”如果前面的分支条件为假,则该推测执行的结果不会被退回。
(与Meltdown不同,当执行的用户代码确实访问未经授权的区域时会触发异常- Meltdown利用了在退回异常所需的时间和访问之后的少量乱序指令之间存在的竞争条件(并且这些指令将不会被退回)。)

0

我的理解(简化版)(可能有误):

当x超出边界时,处理器将加载存储在其他位置的数据。(有点像缓冲区溢出)

例如,当数据以以下方式保存:

1 <- 开始数组

2

3 <- 开始秘密数据

4

当x大于边界时,它可以读取例如3(在论文中可能是任何东西,被命名为k)。然后将3缓存。

使用3来加载第二个数组中的数据。处理器意识到错误并将其(3 / k)从缓存中删除。

然后攻击者可以使用不同的方法恢复这个3(或在论文中的k)。例如尝试一个数字并测量加载时间,然后从头开始重复所有步骤。

(抱歉英语不好)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接