欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

现代 CPU 分支预测机制与 Spectre(幽灵)安全漏洞

发表于:|最后更新:|分类:安全与运维|阅读:1301 次

现代超标量处理器为了榨干硬件算力,广泛采用了指令流水线(Pipeline)与推测执行(Speculative Execution)技术。当遇到条件跳转指令(如 if (x < array1_size))时,若等待边界检查的内存数据从高延迟的 DRAM 加载完成,CPU 流水线将会陷入长达数百个时钟周期的停顿。为了消除停顿,分支预测器(Branch Predictor)会根据历史执行记录“猜测”分支走向,并直接沿预测分支预先执行后续指令。若最终条件确认猜测错误,CPU 会清空流水线并回滚架构寄存器状态,理论上不会对系统状态造成任何影响。然而,2018 年曝光的 Spectre 漏洞(CVE-2017-5753) 撕开了这层保护罩:推测执行虽然回滚了架构状态,但却在 CPU 缓存(Cache)中留下了物理侧信道痕迹!C// 攻击者代码结构 if (x < array1_size) { y = array2[array1[x] * 4096]; } 攻击者通过精心训练分支预测器使其偏向为真,随后传入一个远超出 array1_size 的非法偏移 x(指向受害者的敏感内存)。CPU 推测执行了越界读取,并将 array2 中对应内存块拉入 L1/L2 缓存。在后续回滚后,攻击者通过高精度的 rdtsc 指令测量访问 array2[i * 4096] 每一个元素的时间(Flush+Reload 技术)。缓存命中的条目访问延迟显著低于 DRAM,攻击者借此直接逆向推断出了越界内存中的隐秘数据。