gpt4 book ai didi

linux - 使用分支预测器了解 Spectre 漏洞

转载 作者:太空狗 更新时间:2023-10-29 11:20:58 25 4
gpt4 key购买 nike

描述 paper 的 Spectre 漏洞,我们可以看到它谈到了这个特定的漏洞

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

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

所以我的问题是为什么我们还需要有这个 if 语句。要是有这句话就好了

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

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

最佳答案

Why do we need even this if statement ?

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

为攻击创建时间窗口

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

一旦我们到达 if 语句,CPU 等待 array1_size 从主内存加载。同时,分支预测器说“选择分支”,推测执行继续进行,访问 array1 之外的数据并对 array2 产生副作用。

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

避免崩溃

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

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

简单示例

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

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

关于linux - 使用分支预测器了解 Spectre 漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com