深入解析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处理器采用异步权限检查——先读取缓存值,若权限检查失败再中止执行。由于处理器速度远快于内存,在权限结果返回前可能已推测执行数十条指令。

攻击步骤

  1. 用户程序申请大内存块bigblock(分为256段)并确保无缓存
  2. 通过操作延迟内核地址权限检查
  3. 尝试读取内核字节secret_kernel_byte(0-255值)
  4. 在权限检查完成前,处理器推测执行指令:用该字节值索引访问bigblock[secret_kernel_byte]并触发缓存
  5. 权限检查返回拒绝,所有推测指令被撤销,但bigblock的特定段仍保留在缓存中
  6. 程序测量读取bigblock各段的时间,被缓存段读取速度显著更快
  7. 快速段的索引值即为内核字节值(如bigblock[42]最快则字节值为42)
  8. 通过此缓存计时侧信道以503KB/s速率持续读取内核内存

推测读取的内核内存效应通过缓存侧信道泄露

影响与应对

安全影响

  • 恶意软件可窃取密码、网络流量并持久驻留
  • 对云服务商(Amazon/Google/Microsoft)是灾难性漏洞:单物理机上的数百虚拟机可互相窥探数据
  • 修复导致性能下降:旧Intel处理器下降5-30%,云服务商需增购5-30%服务器维持原有性能

应对措施

  • 立即安装操作系统最新更新(MacOS/Windows/Linux)
  • 云服务商已内部部署修复,用户无需操作

下篇预告

本文第二部分将详解Spectre V1/V2变种的技术细节,并探讨为何这些漏洞能隐藏25年。技术背景将更复杂,但漏洞机制也更具趣味性。

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-09-22 09:29  qife  阅读(3)  评论(0)    收藏  举报