security - “训练”一个分支预测器是什么意思?
问题描述
我正在阅读这篇关于类似于 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
分支预测器是使用权重来偏置预测还是基于先前的预测/错误预测的一种方式或另一种方式?
解决方案
这意味着创建一个分支,为您正在攻击的分支提供别名(通过将其放在特定地址,可能与另一个进程中的虚拟地址相同,或者 4k 或其他 2 的幂偏移可能有效),并运行它很多次来偏向预测器。
这样当你用 Spectre 攻击的分支实际运行时,它就会按照你想要的方式进行预测。(或者对于间接分支,会跳转到你想要的虚拟地址)。
现代 TAGE 分支预测器索引基于分支历史(导致该分支的动态指令流中的其他分支),因此正确的训练可能会很复杂......
但在最简单的层面上,是的,具有超过 1 位状态的分支预测器记住的不仅仅是最后一个分支方向。 维基百科有一篇关于分支预测的许多不同实现的大文章,从简单的 2 级饱和计数器开始。
训练他们需要让你控制的分支重复以同样的方式运行。
具体来说,您会将类似 asm 的内容放在一个循环中(在一个已知地址),然后重复运行它。
xor eax,eax ; eax=0 and thus set ZF
jnz .target ; always not-taken
然后目标分支将通过并运行您想要的 Spectre“小工具”,即使它通常已被占用。
推荐阅读
- c - fgets while 循环,编译器警告有关无效语句的语句
- python - 使用 toch log_prob 计算选择分布本身的多个值的概率
- flutter - Flutter:如何在 ListView.builder 中保存小部件状态
- visual-studio-code - Vscode 不断在我的行中添加空格(缩进)
- java - fxml 文件不会加载
- python - 如何在python中更准确地找到局部最大值(最小值)?
- encryption - 有没有办法下载受 Apple FairPlay DRM 保护的视频?
- python - 无法在 Docker 运行中运行 python 文件 - docker:无效的引用格式和 docker:来自守护程序的错误响应
- javascript - JS CLI RPS 游戏问题
- python - TensorFlow 对象检测,检测对象的性能很差