幽灵修复对排序性能的影响

时间:2018-01-11 20:10:38

标签: performance cpu-architecture exploit branch-prediction

famous stackoverflow questions之一是为什么对排序数组进行排序的速度如此之快;而答案是因为分支预测。

对于受影响的处理器(老一代英特尔处理器,AMD Ryzen和ARM),英特尔和微软幽灵修复程序的应用是否会有效地取消此问题中给出的答案?

1 个答案:

答案 0 :(得分:4)

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

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

Spectre的硬件修复必须比#34更加微妙;关闭分支预测" (即在每个条件分支处停止管道)。这可能会在很多代码中将性能降低一个数量级,并且太高而不能成为本地信息泄漏的可接受防御(这可能导致特权升级)。

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

Linux内核正在试验a retpoline以打败内核中间接分支的间接分支预测。不过,即使在启用了Meltdown变通方法(KPTI)的内核中,我也不确定它是否已启用。

脚注:

  1. 有时case的错误switch可以做一些完全不合适的事情(例如在翻译中),如果switch是用嵌套分支而不是单个间接分支编译的话你可以攻击它。 (编译器通常使用switch的分支目标表,但是当案例稀疏时,并不总是可行的。例如case 10 / case 100 / case 1000 / default需要一个990条目数组,只有3个使用过的值。)