所有 CPU 设计都至少存在一些细微的设计缺陷。我们称这些为“勘误表”。
存在一些与安全相关的 CPU 错误。不过,通常“只是” DOS 攻击。
Pentium F00F bug 在 B2 步进之前影响了所有 Intel P5 微架构(修复了它)。 lock cmpxchg8b eax(带有寄存器操作数,而不是内存,因此无效)锁定 CPU 直到硬重启,从而从非特权用户空间进行 DOS 攻击。 (维基百科说它使用locked 总线周期获取非法指令IDT 条目,因此系统保持锁定状态等待相应的从未出现的写入)。它可以通过在尝试处理异常时强制 CPU 出现页面错误来在软件中解决。
该维基百科条目将其与类似时代的 Cyrix CPU 上的 Cyrix "coma bug" 进行比较。
从那时起,英特尔的设计和验证技术取得了进步:奔腾之后的 CPU 具有可更新的微码,它们通过向其抛出随机指令序列来模拟 CPU 的门级软件模型,即使在奇怪的微架构状态下也能捕捉到意外行为。
但错误仍然可能发生。 Skylake 在发现 AH-merging uops weren't always handled correctly 启用了超线程后需要更新微码来禁用其循环缓冲区,从而导致在运行由 OCaml 编译器生成的代码时意外崩溃(勘误 SKL150)。 (我的理解是 Coffee Lake 有一个工作循环缓冲区,但 SKL 和 KBL 仅从 uop 缓存中运行,即使对于紧密循环也是如此。)我认为这充其量只是一个锁定错误;很难得到任何具体的事情来阅读秘密或获得特权。
同样,Skylake 的 mfence 在微码更新中变得更加强大(完全阻止乱序执行,如 lfence)to fix erratum SKL079。可能您无法利用 WC 内存(例如视频 RAM)对 movntdqa 弱排序负载的重新排序,但至少有可能某些东西的安全性/正确性可能取决于它。
有关 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,而不是返回实际数据。这是一些 CPU 已经在做的事情,根据这个测试过的StuffedCow blog article很多微拱门。不过,Spectre 很难做到便宜。)
超线程(以及通常任何 SMT)已经在共享物理内核的线程之间公开了微架构时序侧通道。由于这个和其他原因,加密算法通常是经过仔细编写的,因此它们的性能不依赖于数据。这意味着避免在缓存中丢失的查找表。不过,定时侧信道是一种已知的攻击。