Performance 幽灵修复对分拣性能的影响

Performance 幽灵修复对分拣性能的影响,performance,cpu-architecture,exploit,branch-prediction,Performance,Cpu Architecture,Exploit,Branch Prediction,其中一个最重要的问题是为什么排序数组如此之快;答案是因为分支预测 在受影响的处理器(老一代英特尔处理器、AMD Ryzen和ARM)上应用Intel和Microsoft spectre修复程序是否会有效地消除本问题中给出的答案 不,Spectre的关键是强制错误预测间接分支,因为它们可以跳到任何地址。找到加载所需机密数据的指令序列,然后使用该机密作为数组索引进行另一个与数据相关的加载,这是非常重要的 要攻击常规的take/not take条件分支(如在排序函数中找到的,或在排序或未排序数组上的循

其中一个最重要的问题是为什么排序数组如此之快;答案是因为分支预测


在受影响的处理器(老一代英特尔处理器、AMD Ryzen和ARM)上应用Intel和Microsoft spectre修复程序是否会有效地消除本问题中给出的答案

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

要攻击常规的take/not take条件分支(如在排序函数中找到的,或在排序或未排序数组上的循环中找到的条件分支),您需要找到一种情况,即执行分支的“错误”端(可能是源中if/else的错误端)在使用“错误”运行时会做一些有用的事情寄存器中的值。这似乎有道理,但不太可能,所以大多数针对幽灵的防御措施只会担心间接分支


Spectre的硬件修复必须比“关闭分支预测”(即在每个有条件的分支上暂停管道)更为微妙。这可能会使许多代码的性能降低一个数量级,并且太高,无法作为针对本地信息泄漏的可接受防御措施(这可能导致权限升级)

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

Linux内核正在试验如何击败内核内部间接分支的间接分支预测。不过,我不确定默认情况下是否启用了它,即使在启用熔毁解决方案(KPTI)的内核中也是如此


脚注:

  • 有时
    开关
    的错误
    情况
    可能会做一些完全不合适的事情(例如在解释器中),如果
    开关
    是用嵌套分支而不是单个间接分支编译的,则您可能会攻击它。(编译器通常使用分支目标表作为
    开关
    ,但当案例稀疏时,并不总是可行的。例如
    案例10
    /
    案例100
    /
    案例1000
    /
    默认值
    将需要一个只有3个使用值的990条目数组。)

  • 更正:spectre的一个特点是反对条件分支。在使用索引的代码中进行边界检查可以推测性地读取内存,从而可能最终为攻击者做一些有用的事情。