【问题标题】:Spectre fix impact on sorting performanceSpectre 修复对排序性能的影响
【发布时间】:2018-06-21 06:07:50
【问题描述】:

famous stackoverflow questions 之一就是为什么排序一个已排序的数组如此之快;答案是因为分支预测。

应用 Intel 和 Microsoft Spectre 修复程序是否会有效地取消在受影响处理器(老一代 Intel 处理器、AMD Ryzen 和 ARM)上给出的答案?

【问题讨论】:

    标签: performance cpu-architecture exploit branch-prediction


    【解决方案1】:

    不,Spectre 的关键是强制错误预测 indirect 分支,因为它们可以跳转到任何地址。找到一系列指令来加载您想要的秘密数据,然后使用秘密作为数组索引进行另一个数据相关加载,这并非易事。

    要攻击常规的已采用/未采用条件分支(就像您在排序函数中找到的那样,或者在已排序或未排序数组的循环中的条件分支),您需要找到一个案例:当它以寄存器中的“错误”值运行时,执行分支的“错误”一侧(可能是源中 if/else 的错误一侧)会做一些有用的事情。这似乎是合理的1,但不太可能,因此大多数针对 Spectre 的防御只会担心间接分支。


    Spectre 的硬件修复必须比“关闭分支预测”(即在每个条件分支处停止流水线)更加微妙。这可能会使性能降低一个数量级大量代码,而且代码量太高,无法抵御本地信息泄露(这可能导致权限提升)。

    即使只关闭间接分支的预测(但不是常规条件分支)对于大多数用户空间代码来说可能过于昂贵,因为每个共享库/DLL 函数调用通过主流操作系统(Linux、OS X、Windows)上正常软件生态系统中的间接分支。

    Linux 内核正在试验a retpoline 以击败对间接分支的间接分支预测在内核中。不过,我不确定它是否默认启用,即使在启用 Meltdown 解决方法 (KPTI) 的内核中也是如此。


    脚注:

    1. 有时switch 的错误case 可能会做一些完全不合适的事情(例如在解释器中),如果switch 是使用嵌套分支而不是单个间接分支编译的,那么您可能能够攻击它。 (编译器经常为switch 使用一个分支目标表,但是当案例稀疏时,这并不总是可能的。例如case 10 / case 100 / case 1000 / default 将需要一个只有 990 个条目的数组3 个使用的值。)

    【讨论】:

    • 更正:幽灵 is 的一种风格是针对条件分支的。让边界检查落入使用索引的代码可以推测性地读取内存,因此最终可能会为攻击者做一些有用的事情。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2011-09-02
    • 2013-08-30
    • 2021-03-09
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多