使用分支预测器了解幽灵漏洞

时间:2018-03-03 17:40:32

标签: linux kernel intel microprocessors spectre

在描述paper的幽灵漏洞中,我们可以看到它讨论了这个特定的漏洞

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声明?

2 个答案:

答案 0 :(得分:0)

  

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

我们需要if语句来创建一个时间窗口,因此可以进行攻击并且2)避免程序崩溃。

为攻击创建时间窗口

if的主要目的是创建一个时间窗口。为了实现这一点,array1_size不得在缓存中。

一旦我们到达if语句,CPU等待从主内存加载array1_size。与此同时,分支预测器表示&#34;采取分支&#34;并且推测性执行继续进行,访问array1之外的数据并对array2产生副作用。

如果array1_size在缓存中,则无法实现。实际上,CPU会很快意识到x超出了范围并且中止了推测执行。

避免崩溃

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

CPU在推测执行期间屏蔽任何故障,直到指令实际停用。 if确保带有无效x的说明永远不会退役。一旦CPU意识到猜测出错,它们就会产生副作用并刷新。

简单示例

以下是基于幽灵的崩溃攻击(即2合1)的简单示例:https://github.com/berestovskyy/spectre-meltdown

IMO比Specre论文的原始代码更简单易懂。它只有99行(包括注释)。

答案 1 :(得分:0)

数组访问总是以边界检查为界,没有边界检查,这是普通的缓冲区溢出编程 BUG ,可以很容易地利用它而无需使用推测执行。