首页 > 解决方案 > “训练”一个分支预测器是什么意思?

问题描述

我正在阅读这篇关于类似于 Spectre 的理论 CPU 漏洞的文章,它指出:

“攻击者需要训练分支预测器,使其可靠地错误预测分支。”

我大致了解什么是分支预测以及它是如何工作的,但是“训练”一个分支预测器意味着什么?这是否意味着偏向一个分支,使其在计算上比另一个更昂贵,或者它是否意味着(在一个循环中)不断地让 CPU 在继续下一个错误预测的分支之前正确预测一个特定的分支?

例如,

// Train branch predictor
for (int i = 0; i < 512; i++)
{
    if (true){
        // Do some instructions
    } else {
        // Do some other instruction
    }
}

// The branch predictor is now "trained"/biased to predict the first branch?

// Proceed to attack

分支预测器是使用权重来偏置预测还是基于先前的预测/错误预测的一种方式或另一种方式?

标签: securitycpucpu-architecturecpu-cachebranch-prediction

解决方案


这意味着创建一个分支,为您正在攻击的分支提供别名(通过将其放在特定地址,可能与另一个进程中的虚拟地址相同,或者 4k 或其他 2 的幂偏移可能有效),并运行它很多次来偏向预测器。

这样当你用 Spectre 攻击的分支实际运行时,它就会按照你想要的方式进行预测。(或者对于间接分支,会跳转到你想要的虚拟地址)。


现代 TAGE 分支预测器索引基于分支历史(导致该分支的动态指令流中的其他分支),因此正确的训练可能会很复杂......

但在最简单的层面上,是的,具有超过 1 位状态的分支预测器记住的不仅仅是最后一个分支方向。 维基百科有一篇关于分支预测的许多不同实现的大文章,从简单的 2 级饱和计数器开始。

训练他们需要让你控制的分支重复以同样的方式运行。


具体来说,您会将类似 asm 的内容放在一个循环中(在一个已知地址),然后重复运行它。

xor   eax,eax    ; eax=0 and thus set ZF
jnz   .target    ; always not-taken

然后目标分支将通过并运行您想要的 Spectre“小工具”,即使它通常已被占用。


推荐阅读