推测性存储绕过(Spectre V4)

时间:2018-09-27 21:02:12

标签: spectre

有人知道我是否可以找到有关Spectre V4(推测性商店绕过)漏洞的更多信息?我已经知道V1-V3以及Foreshadow。我发现Intel's description有点让人困惑,尤其是他们的示例代码(我在这里复制了它)

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]

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

1 个答案:

答案 0 :(得分:1)

此问题的答案在链接的intel帖子中,尤其是本段:

  

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

在示例代码中,处理器预测第2行中的负载*X(从变量X开始)与存储重叠而不到变量X。intel提供的示例是有点令人困惑,因为在大多数情况下,X的两个实例都将使用相同的名称进行访问。一个更好的例子是这样的(假设这是一个使用非优化编译器编译的伪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/的说明中有一些汇编代码,也许可以更好地说明这一点。