我阅读了这两个漏洞,也阅读了一些 CPU 和处理器的历史。我想知道之前是否还有硬件(尤其是处理器的)。
所有 CPU 设计至少都有一些微妙的设计缺陷。我们称这些为“勘误表”。
存在一些与安全相关的 CPU 错误。不过,通常“只是”DOS 攻击。
在奔腾F00F
的错误影响了B2步进(其中固定它)之前,所有的英特尔微体系结构P5。该lock cmpxchg8b eax
(带寄存器操作数,而不是记忆,因而无效)锁定CPU,直到硬重启,给无特权用户运行DOS攻击。(维基百科说它使用lock
ed 总线周期获取非法指令 IDT 条目,因此系统保持锁定状态,等待从未出现的相应写入)。可以在软件中通过在尝试处理异常时强制 CPU 进行页面错误来解决。
该维基百科条目将其与类似时代的 Cyrix CPU 上的Cyrix“昏迷错误”进行了比较。
从那时起,英特尔的设计和验证技术取得了进步:奔腾之后的 CPU 具有可更新的微代码,它们通过向其抛出随机指令序列来模拟 CPU 的门级软件模型,即使在奇怪的微体系结构状态下也能捕获意外行为。
但是错误仍然可能发生。Skylake 需要一个微码更新来禁用其循环缓冲区,因为在启用超线程的情况下,AH 合并 uops 并不总是正确处理,导致在运行 OCaml 编译器生成的代码时意外崩溃(勘误 SKL150)。(我的理解是 Coffee Lake 有一个工作循环缓冲区,但 SKL 和 KBL 只从 uop 缓存中运行,即使是紧循环。)我认为这充其量只是一个锁定错误;很难获得任何特定的东西来读取机密或获得特权。
类似地,Skylakemfence
在微代码更新(完全阻止乱序执行,如lfence
)中变得更加强大,以修复错误 SKL079。可能您无法利用movntdqa
WC 内存(例如视频 RAM)中弱排序加载的重新排序,但至少有可能某些东西的安全性/正确性可能取决于它。
有关Skylake 的完整列表,请参阅https://www3.intel.com/content/dam/www/public/us/en/documents/specification-updates/desktop-6th-gen-core-family-spec-update.pdf勘误。
AMD 当然也为他们的 CPU 发布了勘误表。
Meltdown 和 Spectre 的不同之处在于 CPU 架构师知道 CPU 以这种方式工作,但没有意识到有一种方法可以利用它。这是非常微妙的,将秘密数据转换为微架构状态,然后将该微架构状态读回架构状态(寄存器中的实际值在正确路径上,而不是在错误预测的阴影中)。
就我们所知,我们还需要重新设计 CPU 以有效缓解其他令人讨厌的意外(新类别的微架构攻击)。
(Meltdown 很容易通过新设计以廉价的方式缓解,只需将低特权的 TLB+L1d 命中屏蔽为 0,而不是返回实际数据。根据这篇测试了许多微架构的StuffedCow 博客文章,一些 CPU 已经这样做了。不过,Spectre 很难做到便宜。)
超线程(以及通常的任何 SMT)已经暴露了共享物理内核的线程之间的微架构时序旁道。由于这个和其他原因,加密算法通常被仔细编写,因此它们的性能不依赖于数据。这意味着避免可能在缓存中丢失的查找表。不过,定时侧信道是一种已知的攻击。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句