首页 > 解决方案 > 推测性存储绕过(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]

由于最后两条指令之间存在真正的依赖关系,处理器如何推测性地执行最后一次加载。(我认为乱序执行仍然应该尊重真正的依赖,对吧?)

标签: spectre

解决方案


这个问题的答案在链接的英特尔帖子中,特别是这一段:

推测性存储绕过利用了许多高性能处理器中的内存消歧预测器功能,即使前面的潜在重叠存储的地址未知,也允许负载推测性地执行。如果处理器预测加载地址不会与未知地址重叠,则加载可能会推测性地执行。如果确实存在重叠,则负载可能会推测性地读取过时的数据。

在示例代码中,处理器预测加载*X(来自 variable X)不会与第X2 行中的 store to variable 重叠。 intel 给出的示例有点令人困惑,因为在大多数情况下,Xthere 的两个实例都会被一样的名字。一个更好的例子是这样的(假设这是一些用非优化编译器编译的伪 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/的解释有一些汇编代码可能说明这个好一点。


推荐阅读