首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用分支预测器了解频谱漏洞

使用分支预测器了解频谱漏洞
EN

Stack Overflow用户
提问于 2018-03-04 01:40:32
回答 2查看 222关注 0票数 3

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

代码语言:javascript
复制
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语句。如果只有这句话

代码语言:javascript
复制
   y = array2[array1[x] * 256];

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

EN

回答 2

Stack Overflow用户

发布于 2018-03-06 16:37:11

为什么我们甚至需要这个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意识到投机出错,它们就会被清除。

简单的例子

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-29 17:34:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49087194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档