spectre - 推测性存储绕过(Spectre V4)
问题描述
有谁知道是否有一个地方可以让我了解有关 Spectre V4(推测存储绕过)漏洞的更多信息?我已经知道 V1-V3 和 Foreshadow。我发现 英特尔的描述有点混乱,尤其是他们的示例代码(我在这里复制了它)
X = &K; // Attacker manages to get variable with address of K stored into pointer X
<at some later point>
X = &M; // Does a store of address of M to pointer X
Y = Array[*X & 0xFFFF]; // Dereferences address of M which is in pointer X in order to
// load from array at index specified by M[15:0]
由于最后两条指令之间存在真正的依赖关系,处理器如何推测性地执行最后一次加载。(我认为乱序执行仍然应该尊重真正的依赖,对吧?)
解决方案
这个问题的答案在链接的英特尔帖子中,特别是这一段:
推测性存储绕过利用了许多高性能处理器中的内存消歧预测器功能,即使前面的潜在重叠存储的地址未知,也允许负载推测性地执行。如果处理器预测加载地址不会与未知地址重叠,则加载可能会推测性地执行。如果确实存在重叠,则负载可能会推测性地读取过时的数据。
在示例代码中,处理器预测加载*X
(来自 variable X
)不会与第X
2 行中的 store to variable 重叠。 intel 给出的示例有点令人困惑,因为在大多数情况下,X
there 的两个实例都会被一样的名字。一个更好的例子是这样的(假设这是一些用非优化编译器编译的伪 c)
X = &K;
Z1 = &X;
Z2 = &X;
*Z1 = Z1;
Y = Array[*Z2 & 0xFFFF];
这里我们有两个指向同一个位置的指针(Z1 和 Z2)。但是 CPU 可能会预测它们不会重叠,因此“*Z2”可能会推测性地读取错误的值。
https://blogs.technet.microsoft.com/srd/2018/05/21/analysis-and-mitigation-of-speculative-store-bypass-cve-2018-3639/的解释有一些汇编代码可能说明这个好一点。
推荐阅读
- mysql - SQLSTATE [42S22]:“where 子句”中的未知列
- opengl - 在 OpenGL 中使用几何着色器修剪基元
- google-cloud-platform - 默认窗口和默认触发器如何在 Apache Beam 中工作
- c++ - msxml3.dll:没有这样的文件或目录
- python - 使用 cmd/powershell/python 将 .out 文件转换为 .txt 文件
- javascript - Application Insights 记录到错误的目标
- javascript - 在某个点停止/禁用垂直滚动,但能够向上滚动页面但不能向下滚动
- python - 如何使用 matplotlib 设置所有四个轴
- html - 由给定时钟时间触发的简单 HMTL5 时间进度条?
- javascript - React JS removeEventListener没有触发