一条超长指令攻破 SMM 安全防线
Exploiting System Management Mode with a very long interrupt

SMM 作为 x86 处理器中运行在后台的超特权安全环境,其核心假设是所有核心必须同步进入或退出。然而,研究者 Christopher Domas 发现,只需让一个核心执行一条耗时超过 1 秒的超长指令,就能利用 SMM 的同步超时机制,使其在等待其他核心时放弃同步。这导致部分核心留在 SMM 之外运行,而其他核心已进入 SMM,从而打破了 SMM 的隔离性。这一漏洞使得原本因缺乏外部攻击面而被视为安全的 100 多个 SMM TOCTOU CVE 变得可从软件层面利用,无需物理访问或恶意硬件。
SMM 的唯一承诺——在它运行时其他什么都不运行——在一条荒谬的长指令面前分崩离析。
HN 评论区
76- mike_hearn
固件的设计者显然预见到了这种攻击,但把问题踢给了厂商:
//
// 平台实现者应选择合适的超时值:
[snip]
// - 超时值必须长于系统中可能发生的任何 IO 操作的最长时间
- codedokode
从技术上讲,这不算漏洞,因为你得有 root 权限。我更愿意称之为“夺回硬件控制权”。SMM 是个邪恶的东西,因为用户既无法控制它,也无法查看 SMM 内存区域。CPU 厂商为什么要实现一种用户无法控制的模式?显然是为了那些对用户不友好的用途(软件复制保护与上报、DRM、政府后门等),我看不到其他解释。
- Hyperlisk
他们的相关仓库,readme 里也提到了:https://github.com/xoreaxeaxeax/asm-hall-of-shame
> 指令延迟分析通常关注性能优化——让代码跑得尽可能快。而 Assembly Hall of Shame 则反其道而行之:寻找单条指令性能的绝对下限。
挺有意思!
- nazgulsenpai
readme 为了强调这必须是一条 LOOOOOOOOOOOOOOOOOOOONG 指令,所费周折的程度让我忍俊不禁,包括那个不必要的超长代码块示例。这个话题本身挺有趣,但这让它变得更有娱乐性了。
- hyperhello
SMM 需要设置超时,是因为它希望所有操作在形式上都发生在指令之间。所以,如果某个核心上正在执行一条非常长的指令,但指令完成后,核心就会停止,对吧?看来要把它变成攻击手段,你得有一条非常长的指令,并且这条指令在执行过程中还得以某种方式干扰 SMM 正在做的事情。