背景知识
首先快速回顾关键的计算机架构概念,这些是理解漏洞原理的基础:
软件即指令与数据
所有软件(如Chrome/Photoshop等)都是由处理器执行的指令序列,这些指令操作内存(RAM)和寄存器中的数据。软件默认指令按顺序执行——这个假设如同"时间旅行不可能"般基础且必要。
处理器的速度优化
现代Intel处理器每秒可执行约3000亿条指令。三个关键优化技术——缓存、推测执行和分支预测——与指令顺序执行假设存在潜在冲突。
缓存机制
- 内存访问速度(~100ns)比指令执行(~2ns)慢50-100倍
- 处理器通过多级缓存(L1/L2/L3)存储高频访问数据
- 缓存访问速度(1-3ns)显著快于主内存
- 通过测量内存访问时间,程序可探测数据是否被缓存(形成侧信道)
推测执行
- 现代处理器并行执行指令束后重排序结果(乱序执行)
- 执行4条指令:顺序执行需8ns,并行执行仅需2ns(提速75%)
- 当预测错误时(如除零异常),需"撤销"已执行指令
- 研究发现某些撤销指令的副作用仍会残留
分支预测
- 条件分支(if-else)和间接分支(函数指针)控制执行流
- 现代分支预测器准确率>96%
- 预测错误时,处理器会用错误上下文推测执行指令
- Spectre漏洞证明可操控分支预测器并检测错误执行痕迹
Meltdown漏洞原理
Meltdown是自1995年以来几乎所有Intel处理器都存在的设计缺陷,允许用户程序读取本应无权访问的内核内存。
权限隔离机制
处理器通常有两种特权模式:
- 用户模式:运行普通应用程序
- 内核模式:运行操作系统核心,包含敏感数据(按键记录、加密密钥等)
漏洞核心
当满足以下条件时:
- 内核内存内容已在缓存中
- 权限检查表未在缓存中(需从主存读取) Intel处理器会异步检查权限:先读取缓存值,若权限检查失败再中止执行。由于内存速度限制,可能有数十条指令被推测执行。
研究者发现:即使指令被撤销,通过缓存时序侧信道仍可观测到推测执行的痕迹,且痕迹内容与内核内存值相关。
攻击步骤详解
- 用户程序申请大内存块
bigblock
(分为256段)并确保其未被缓存 - 精心构造使内核地址权限检查延迟
- 尝试读取内核字节
secret_kernel_byte
(0-255) - 在权限检查完成前,处理器推测执行
x = bigblock[secret_kernel_byte]
导致对应段被缓存 - 权限检查失败后,虽然指令被撤销,但
bigblock
的特定段仍保留在缓存中 - 通过测量读取
bigblock
各段的时间差异,可推断secret_kernel_byte
的值 - 重复该过程可实现503KB/s的内核内存读取速度
影响范围
- 个人电脑:恶意软件可窃取密码/网络流量等(需立即更新系统)
- 云服务商(AWS/Google等):灾难性漏洞,可能突破虚拟机隔离,导致租户间数据泄露
- 性能损失:修复补丁导致5-30%性能下降,对拥有200万服务器的AWS意味着需额外部署10-60万台服务器
应对措施
- 立即安装操作系统更新(MacOS/Windows/Linux)
- 云服务商已内部部署修复方案
(下篇将解析Spectre两种变体及其25年未被发现的原因)