深入浅出解析Meltdown与Spectre漏洞(第二部分):Spectre变体技术细节与影响

本文详细解析Spectre变体1和变体2的技术原理,包括分支预测误导、推测执行滥用和缓存计时侧信道攻击,涵盖对桌面用户和云服务的严重影响及缓解措施。

Spectre(变体1)

Spectre的第一个变体允许程序读取本无权访问的内存。Spectre V1攻击之所以可能,是因为分支预测和推测执行两种优化的结合。攻击通过误导条件分支预测器跳过安全检查,在错误上下文中推测执行指令,并通过缓存计时侧信道观测执行效果。

技术细节

假设通过JavaScript在浏览器中实施攻击(实际适用所有程序类型):

  1. 创建两个大型内存分配:leaker(用于缓存计时侧信道)和reader(用于训练分支预测器)
  2. 训练分支预测器:通过重复读取reader的合法边界内值,使预测器认为边界检查总是通过
  3. 确保leaker无缓存内容
  4. 读取reader的越界元素(称为secret)。由于预测器已被训练认为边界检查成功,该读取会在推测执行中暂时成功
  5. 使用secret值作为索引读取reader元素(即reader[secret]),该操作会被推测执行并缓存对应元素
  6. 通过测量每个元素的读取时间,确定被缓存的元素索引,该索引即为本无权读取的secret

攻击带宽估计为10KB/s。图2展示了内存中reader和秘密数据的假设布局。

影响是什么?

  • 对桌面/移动用户:网站可突破浏览器安全隔离,读取其他标签页的密码或信用卡号
  • 对云服务商:破坏编程语言提供的隔离保证,需重新评估安全架构并重构核心代码(伴随性能损失)

无通用修复方案,需重新编译软件避免易受攻击代码模式。浏览器厂商已移除高精度计时器并避免危险代码模式。

应该怎么做?

更新浏览器、操作系统和BIOS至最新版本。所有主流云服务商已部署缓解措施。

Spectre(变体2)

第二个变体允许程序读取无权访问的内存,无论内存属于同一程序、其他程序还是操作系统内核。

与V1类似,V2同样滥用分支预测、推测执行和缓存计时侧信道。但V2针对间接分支预测器,该预测器不区分权限变更(用户/内核、程序间、虚拟机/管理程序),因此可跨越现代处理器提供的几乎所有权限级别。

技术细节

以从客户虚拟机读取管理程序特权内存为例(Google Project Zero已验证真实环境可行性):

攻击准备:

  1. 分配用于缓存计时侧信道的reader内存块
  2. 利用Linux KVM的eBPF解释器创建所需代码模式
  3. 通过BHB"读取"管理程序代码位置,定位关键组件地址

攻击执行:

  1. 确保reader无缓存内容
  2. 执行特殊构造的间接分支序列,污染BHB使预测器将管理程序的间接分支指向eBPF解释器
  3. 设置处理器状态,使eBPF解释器执行特定代码读取特权内存字节并访问reader
  4. 触发管理程序执行无害操作引发目标间接分支,启动推测执行链
  5. 通过缓存计时确定被访问的reader块索引,即泄露的隐私数据字节

图6展示了V2攻击中秘密数据泄露的可视化流程。

影响是什么?

结合了Spectre V1和Meltdown的最坏影响。云提供商面临严重威胁:现有概念验证可突破最强隔离机制,且多种架构的处理器均受影响。

多种缓解方案均存在性能代价:处理器厂商发布微码更新调整工作方式,软件可重新编译避免使用间接分支。

应该怎么做?

更新操作系统和固件(BIOS/UEFI)至最新版本。主流云服务商已部署防护措施。

这一切如何发生?

25年来未被发现的原因:

  1. 计算基础假设变化:90年代多为单用户系统且缺乏内存保护,性能收益显著而安全问题不明显
  2. 如今多租户云环境和浏览器沙箱机制使内存隔离泄露成为严重问题
  3. 虽有多项研究暗示推测执行可能导致信息泄露,但概念验证的实现极具挑战性

结论

本文旨在帮助非体系结构背景的读者理解Meltdown和Spectre的技术原理、影响和缓解方案。未来微架构攻击将继续成为安全领域的重要威胁,因大量现有平台仍存在漏洞。

分享至:Twitter、LinkedIn、GitHub、Mastodon、Hacker News

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计