【问题标题】:LFENCE is really useless vs. Spectre #2?与 Spectre #2 相比,LFENCE 真的没用吗?
【发布时间】:2018-07-04 20:16:27
【问题描述】:

有谁知道为什么建议 LFENCE 指令在 Spectre #1(边界检查绕过/越界读取)的情况下停止推测执行,但在 Spectre #2(分支目标注入)的情况下无用?这两个 Spectre 漏洞都与推测执行有关,并且正在利用分支预测器。据我了解,在第一种情况下涉及通用预测器,在第二种情况下涉及间接调用预测器。如果我开始使用 LFENCE 来防止基于间接调用预测器的推测执行以减轻 Spectre #2 的影响,它会有用吗?

【问题讨论】:

    标签: assembly memory x86 x86-64 cpu-architecture


    【解决方案1】:

    来自Spectre paper

    7 缓解选项

    条件分支漏洞可以是 如果可以停止推测性执行,则可以缓解 潜在敏感的执行路径。

    这意味着如果你有类似的代码

    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为目标。

    【讨论】:

    • 显然这可以通过在关键代码中穿插lfence 语句来解决,这样攻击者就无法避免其执行。然而,这会带来巨大的性能成本。
    • @Johan 据我了解,问题在于攻击者可以在所有受害者的可执行代码中选择gadget。也许编写“关键代码”有点不精确:攻击者需要一个访问内存的序列,然后使用加载的值作为地址计算的一部分,从而导致另一个内存访问。为防止信息泄漏,缓解措施必须在每对此类小工具内存访问之间放置一个序列化指令。要求很高,尤其是在 x86 这样的可变长度指令编码架构上。
    • 在 Spectre #2 的情况下,据我了解,攻击者需要来自受害者进程的小工具,该小工具应包含 jmp/call/ret,否则,他无法使用间接分支预测器。但是,坦率地说,我无法想象来自受害者进程的 call/jmp/ret 如何导致执行攻击者的代码......你有一个简单的代码 sn-p 来解释吗? @EOF。
    • @ArtemBaranov CPU 中的分支预测机制是共享的。攻击者可以通过在自己的进程中执行间接跳转来训练分支目标预测。然后,攻击者需要在受害者进程中发生间接分支,但现代面向对象代码执行大量间接分支。
    • @EOF 英特尔表示,当您想减轻 Spectre #2 的影响时,lfence 在 retpoline 构造中很有用。 software.intel.com/sites/default/files/managed/1d/46/…
    猜你喜欢
    • 2017-01-15
    • 2017-02-17
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2010-12-15
    • 2021-10-28
    • 2016-09-23
    相关资源
    最近更新 更多