深入解析Meltdown与Spectre漏洞:CPU设计缺陷与侧信道攻击
背景知识
软件是指令与数据的集合
所有软件(如Chrome、Photoshop等)都是由处理器执行的指令序列,这些指令对内存和寄存器中的数据进行操作。关键假设是指令按顺序执行——这相当于假设时间旅行不可能成立。
箭头显示分支指令与其潜在目标的关系
缓存机制
处理器执行指令速度(约2ns/指令)远快于内存访问速度(约100ns/次)。为解决此矛盾,处理器将频繁访问的内存内容副本存储在芯片上的缓存中(L1/L2/L3缓存),访问速度提升至1-3ns。当缓存满时,新项目需置换旧项目。通过测量内存访问时间,可推断目标数据是否被缓存——这正是Meltdown与Spectre利用的缓存计时侧信道基础。
L1/L2缓存位于核心内,L3缓存被多核心共享
推测执行
现代处理器采用乱序执行技术:同时执行多条指令后重排序结果,伪装成顺序执行。例如同时执行4条指令仅需2ns(顺序执行需8ns)。当处理器预测错误时(如遇到除零异常),已执行的推测指令需被"撤销",但研究人员发现某些副作用无法完全消除。
假设4个执行单元且指令无依赖关系
分支预测
分支指令控制执行流,分为条件分支(如if判断)和间接分支(如函数指针)。处理器通过分支预测器猜测分支目标(准确率>96%),预测错误时撤销已执行指令。Spectre漏洞正是通过操纵分支预测器来保留推测指令的副作用。
cmp指令操作数相等时跳转(绿箭头),否则继续执行(红箭头)
跳转到0x10000c5f0地址处的initterm函数
Meltdown漏洞详解
核心原理
Meltdown是自1995年以来几乎所有Intel处理器的设计缺陷,允许用户程序读取本无权限访问的内核内存。处理器采用用户态和内核态两种特权模式,用户程序禁止读取内核内存(包含按键记录、网络流量、加密密钥等敏感数据)。
关键突破点在于:当内核内存内容已缓存但权限信息未缓存时,Intel处理器采用异步权限检查——先读取缓存值,若权限检查失败再中止执行。由于处理器速度远快于内存,在权限结果返回前可能已推测执行数十条指令。
攻击步骤
- 用户程序申请大内存块
bigblock
(分为256段)并确保无缓存 - 通过操作延迟内核地址权限检查
- 尝试读取内核字节
secret_kernel_byte
(0-255值) - 在权限检查完成前,处理器推测执行指令:用该字节值索引访问
bigblock[secret_kernel_byte]
并触发缓存 - 权限检查返回拒绝,所有推测指令被撤销,但
bigblock
的特定段仍保留在缓存中 - 程序测量读取
bigblock
各段的时间,被缓存段读取速度显著更快 - 快速段的索引值即为内核字节值(如
bigblock[42]
最快则字节值为42) - 通过此缓存计时侧信道以503KB/s速率持续读取内核内存
推测读取的内核内存效应通过缓存侧信道泄露
影响与应对
安全影响
- 恶意软件可窃取密码、网络流量并持久驻留
- 对云服务商(Amazon/Google/Microsoft)是灾难性漏洞:单物理机上的数百虚拟机可互相窥探数据
- 修复导致性能下降:旧Intel处理器下降5-30%,云服务商需增购5-30%服务器维持原有性能
应对措施
- 立即安装操作系统最新更新(MacOS/Windows/Linux)
- 云服务商已内部部署修复,用户无需操作
下篇预告
本文第二部分将详解Spectre V1/V2变种的技术细节,并探讨为何这些漏洞能隐藏25年。技术背景将更复杂,但漏洞机制也更具趣味性。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码