Spectre(变体1)
Spectre的第一个变体允许程序读取本无权访问的内存。Spectre V1攻击之所以可能,是因为分支预测和推测执行两种优化的结合。攻击通过误导条件分支预测器跳过安全检查,在错误上下文中推测执行指令,并通过缓存计时侧信道观测执行效果。
技术细节
假设通过JavaScript在浏览器中实施攻击(实际适用所有程序类型):
- 创建两个大型内存分配:
leaker
(用于缓存计时侧信道)和reader
(用于训练分支预测器) - 训练分支预测器:通过重复读取
reader
的合法边界内值,使预测器认为边界检查总是通过 - 确保
leaker
无缓存内容 - 读取
reader
的越界元素(称为secret
)。由于预测器已被训练认为边界检查成功,该读取会在推测执行中暂时成功 - 使用
secret
值作为索引读取reader
元素(即reader[secret]
),该操作会被推测执行并缓存对应元素 - 通过测量每个元素的读取时间,确定被缓存的元素索引,该索引即为本无权读取的
secret
值
攻击带宽估计为10KB/s。图2展示了内存中reader
和秘密数据的假设布局。
影响是什么?
- 对桌面/移动用户:网站可突破浏览器安全隔离,读取其他标签页的密码或信用卡号
- 对云服务商:破坏编程语言提供的隔离保证,需重新评估安全架构并重构核心代码(伴随性能损失)
无通用修复方案,需重新编译软件避免易受攻击代码模式。浏览器厂商已移除高精度计时器并避免危险代码模式。
应该怎么做?
更新浏览器、操作系统和BIOS至最新版本。所有主流云服务商已部署缓解措施。
Spectre(变体2)
第二个变体允许程序读取无权访问的内存,无论内存属于同一程序、其他程序还是操作系统内核。
与V1类似,V2同样滥用分支预测、推测执行和缓存计时侧信道。但V2针对间接分支预测器,该预测器不区分权限变更(用户/内核、程序间、虚拟机/管理程序),因此可跨越现代处理器提供的几乎所有权限级别。
技术细节
以从客户虚拟机读取管理程序特权内存为例(Google Project Zero已验证真实环境可行性):
攻击准备:
- 分配用于缓存计时侧信道的
reader
内存块 - 利用Linux KVM的eBPF解释器创建所需代码模式
- 通过BHB"读取"管理程序代码位置,定位关键组件地址
攻击执行:
- 确保
reader
无缓存内容 - 执行特殊构造的间接分支序列,污染BHB使预测器将管理程序的间接分支指向eBPF解释器
- 设置处理器状态,使eBPF解释器执行特定代码读取特权内存字节并访问
reader
- 触发管理程序执行无害操作引发目标间接分支,启动推测执行链
- 通过缓存计时确定被访问的
reader
块索引,即泄露的隐私数据字节
图6展示了V2攻击中秘密数据泄露的可视化流程。
影响是什么?
结合了Spectre V1和Meltdown的最坏影响。云提供商面临严重威胁:现有概念验证可突破最强隔离机制,且多种架构的处理器均受影响。
多种缓解方案均存在性能代价:处理器厂商发布微码更新调整工作方式,软件可重新编译避免使用间接分支。
应该怎么做?
更新操作系统和固件(BIOS/UEFI)至最新版本。主流云服务商已部署防护措施。
这一切如何发生?
25年来未被发现的原因:
- 计算基础假设变化:90年代多为单用户系统且缺乏内存保护,性能收益显著而安全问题不明显
- 如今多租户云环境和浏览器沙箱机制使内存隔离泄露成为严重问题
- 虽有多项研究暗示推测执行可能导致信息泄露,但概念验证的实现极具挑战性
结论
本文旨在帮助非体系结构背景的读者理解Meltdown和Spectre的技术原理、影响和缓解方案。未来微架构攻击将继续成为安全领域的重要威胁,因大量现有平台仍存在漏洞。
分享至:Twitter、LinkedIn、GitHub、Mastodon、Hacker News