分支预测器刷新指令是完整的 Spectre 修复吗?

信息安全 幽灵
2021-08-27 21:57:04

我知道 Spectre 主要通过利用分支预测器状态来工作。边界检查绕过和分支目标注入是同一个硬币的两个面,推测执行与分支预测器的交互。

现在,当我听到这个消息时,我立即认为我们需要一条指令来清除分支预测器状态。当从用户空间切换到内核空间或反之亦然或在两个用户空间进程之间切换上下文时,可以使用这样的指令。

显然我并不孤单。Mark 对Spectre 到底有多糟糕?马克提出了同样的建议。这也已在Real World Tech 讨论论坛上提出。

然而,这是对 Spectre 的完整修复吗?对于需要在运行受信任代码的同一用户空间进程中运行不受信任代码的虚拟机(例如 JVM)呢?该指令是否有助于保护此类虚拟机?

1个回答

预测器刷新指令是必要的,但不足以保护 Spectre。对 Spectre 攻击的全面保护需要两件事

  1. 在上下文切换时刷新分支预测器状态。这通过为每个进程提供自己的分支预测器状态来防止一个进程攻击另一个进程。但是,它并不能防止进程的沙盒组件(例如 JIT 编译的 Javascript)攻击同一进程的其他组件。
  2. 分支预测器状态必须考虑分支指令的完整地址(目前,为了节省空间,只使用低位)。这将防止进程攻击自己,因为进程的不同部分必须具有不同的地址。然而,它并不能阻止一个进程攻击另一个进程,因为不同的进程可能使用相同的地址。