Meltdown与Spectre可访问性概述(上篇)
Artem Dinaburg | 2018年1月30日
编译器, 漏洞利用
过去几周,现代处理器中两个关键设计缺陷的细节终于向公众披露。虽然关于Meltdown和Spectre影响的讨论很多,但关于攻击原理和运作机制的详细说明却很少。本文试图以通俗的方式填补这一空白。
背景知识
软件是指令与数据的组合
所有软件(如Chrome、Photoshop等)都是由处理器执行的小型指令序列。这些指令对存储在内存(RAM)和寄存器中的数据进行操作。软件默认指令按顺序执行,这一假设是构建可靠软件的基础。
处理器的速度优化技术
现代Intel处理器每秒可执行约3000亿条指令。为实现这种高速,工程师采用了三种关键技术:
- 缓存:将频繁访问的内存内容复制到处理器附近的缓存中(访问速度1-3ns vs RAM的100ns)
- 预测执行:同时执行多条指令并重新排序结果(4条指令并行执行仅需2ns,顺序执行需8ns)
- 分支预测:预测分支指令的目标地址(现代预测器准确率超96%)
这些优化与指令顺序执行假设存在根本性冲突。
Meltdown漏洞原理
漏洞本质
Meltdown是自1995年以来几乎所有Intel处理器的设计缺陷,允许用户程序读取本无权限访问的内核内存。
技术机制
处理器采用异步权限检查:先读取缓存值,后检查权限。当权限检查未完成时,处理器会继续预测执行后续指令。即使最终权限检查失败并撤销执行,缓存状态的变化却无法完全还原。
攻击步骤
- 申请大内存块
bigblock(分为256个片段)并确保未被缓存 - 精心构造使内核地址权限检查耗时延长
- 尝试读取内核字节
secret_kernel_byte(0-255值) - 在权限检查完成前,处理器预测执行
x = bigblock[secret_kernel_byte]导致对应片段被缓存 - 权限检查失败后指令被撤销,但缓存状态保留
- 通过计时读取
bigblock各片段,被缓存的片段读取速度明显更快 - 快速片段的索引即为内核字节的值(例如
bigblock[42]最快则字节值为42)
攻击者以此方式可实现503KB/s的内核内存读取速度。
影响范围
- 个人设备:恶意软件可窃取密码、网络流量数据
- 云服务商(Amazon/Google/Microsoft):突破虚拟机隔离,租户可互相窃取加密密钥、源代码等敏感数据
- 性能损失:修复补丁导致5-30%性能下降,老旧Intel处理器受影响更严重
应对措施
- 立即安装操作系统(MacOS/Windows/Linux)最新更新
- 云服务商已内部部署修复,用户无需额外操作
(下篇将深入解析Spectre变种及漏洞长期隐藏的原因)