Spectre-v2 新变种 BTR:JIT 引擎复用分支预测,数分钟泄露 Linux root 口令哈希

荷兰阿姆斯特丹自由大学 VUSec 团队与意大利圣安娜高等研究学院于 2026 年 9 月 29 日公开 Spectre-v2 新变种 Branch Target Reuse(BTR)。该攻击绕过现有 Spectre-v2 缓解措施,针对浏览器、语言运行时与操作系统内核中的 JIT 引擎;在已打齐补丁、启用默认防护的 Intel Linux 系统上,端到端利用可在平均 3 至 5 分钟内取出 root 口令哈希。论文已被 ACM CCS 2026 接收。

事件概述

Spectre-v2(分支目标注入)自 2018 年公开以来,业界依靠 retpoline、IBPB、IBRS 等软硬件手段抑制其跨边界泄露能力。BTR 的攻击点在于:CPU 在自修改代码后虽会恢复架构层面的代码一致性,却不一定会让指向旧代码的间接分支预测条目失效。JIT 引擎反复生成、释放并复用同一段内存,这些陈旧的分支目标预测条目便得以存活下来,等到新代码写入同一地址后被重新利用——研究者把这一原语称为“推测性执行释放后使用”。

技术细节

攻击分四步完成:

  • 诱导受害分支跳入攻击者控制的训练代码块,在分支目标缓冲区中植入指向其入口的条目;
  • 释放训练块,并申请部分复用同一地址的目标代码块;
  • 再次触发该间接分支,CPU 依据陈旧条目推测性地跳向旧入口点;
  • 控制流被劫持到新代码中的非预期偏移处,执行错位指令并泄露数据。

在 Linux 侧,PoC 利用经典 BPF(cBPF)JIT:普通进程即可通过 seccomp 或 socket 过滤器附加 cBPF 程序,无需特权,Docker、Chrome 等组件仍在依赖该路径。研究者构造了一个训练程序与一个目标程序,先后装入同一内存区域,跳出陈旧预测后读取内核任务链表定位 su 进程,最终从其映射内存中取出 root 口令哈希,泄露速率约每秒 8 字节。演示环境为 Intel Raptor Cove 平均约 3 分钟、Lion Cove 约 5 分钟。

# 查看 Spectre-v2 缓解措施状态,并确认内核已更新
cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
uname -r

影响评估

研究者在 Intel、AMD、Arm 三类处理器上均确认了底层的陈旧分支预测行为,属跨厂商的硬件设计问题。攻击不要求目标存在可远程直接利用的缺陷,但要求攻击者能在目标机器上运行非特权代码:在桌面场景下,任意网页即可通过浏览器 JIT 触达;在服务器场景下,cBPF JIT 是从非特权进程走到内核内存的关键入口,多租户与共享基础设施的云环境暴露最高。目前尚无证据显示 BTR 已被用于真实攻击。

修复建议

修复依赖两层协同。内核侧,Linux 已合并 CVE-2026-64507 与 CVE-2026-64508 的修复,x86 上在把 cBPF 程序放入曾被 BPF 代码使用过的内存区域时触发 IBPB 屏障,并抑制 JIT 代码区域复用,请关注各发行版公告并更新内核。浏览器侧,Mozilla 正优先完成站点隔离部署并评估 IBPB 方案,Chromium 需同步跟进,两个引擎都依赖 JIT 编译。运行时侧,Oracle 已推出部分 GraalVM 缓解措施,其对 JIT 代码缓存的随机化削弱了地址复用成功率。需要提醒的是,常量盲化可被适配绕过,x86 IBT 与 Arm BTI 等硬件控制流保护并非完全封堵,而 IBPB 每次刷新都带来性能开销。根本解法是让 CPU 在代码释放时同步失效对应预测条目,目前尚无量产处理器实现。

参考来源