有谁知道为什么建议使用LFENCE指令在Spectre#1(边界检查绕过/越界读取)的情况下停止推测执行,但是在Spectre#2(分支目标注入(inject))的情况下却毫无用处?这两个Spectre漏洞都与推测执行有关,并且正在利用分支预测变量。据我了解,第一种情况涉及通用预测变量,第二种涉及间接调用预测变量。如果我开始使用LFENCE来防止基于间接调用预测变量来减轻Spectre#2的推测执行,它会有用吗?
最佳答案
从Spectre paper
这意味着如果您有类似的代码
if (security critical check)
execute critical code
else
do not execute critical code
那么您需要将序列化指令放在安全关键代码之前:
if (security critical check)
lfence
execute critical code
else
do not execute critical code
避免猜测可能会泄漏信息的检查。
在Spectre#2中,攻击者控制CPU推测执行将继续的“入口点”。推杆
lfence
critical code
这无济于事,因为攻击者无需使预测成为
lfence
的目标,他们就可以使它直接成为critical code
的目标。关于assembly - LFENCE与Spectre#2真的没用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48445290/