BP类攻击建模
Branch Prediction Attack
Define
BP 类攻击 指的是利用CPU 分支预测机制及其副作用 来泄露敏感信息或在隔离边界上建立侧信道的攻击。它属于一种微架构侧信道(microarchitectural side-channel),常见的代表是Spectre 系列攻击。这些攻击不是针对软件算法错误,而是针对处理器预测逻辑和投机执行(speculative execution)的硬件行为。
核心思想:
- 现代 CPU 为提高性能,会对条件分支/间接跳转做预测,并投机执行路径。
- 如果预测错误,CPU 会回滚架构状态,但 微架构状态(如缓存)可能已被改变。
- 攻击者能通过对这些副作用的测量(例如缓存命中时间)来推断敏感数据。
Threat Model
攻击目标
| 目标类型 | 例子 |
|---|---|
| 机密数据泄露 | 进程内密钥、用户密码、其他内存内容 |
| 跨进程/跨 VM 数据泄露 | 虚拟化场景下的邻居 VM 隐私泄露 |
| 沙盒环境绕过 | 浏览器 JavaScript 利用 Spectre 读取内核/其他进程数据 |
攻击者能力假设
BP 类攻击通常假设攻击者可以:
- 在同一处理器核心或共享预测器资源上执行代码;
- 构造特定模式的分支历史输入;
- 测量系统行为变化(如 cache timing);
- 在某些场景下无需内核权限(pure JavaScript 也可利用)。
这种能力模型类似于一种“白盒微架构侧信道访问”,不需要直接访问内存内容本身。
抽象模型
BP 攻击可以抽象为以下四个阶段:
① 污染/训练分支预测器(Branch Predictor Training)
攻击代码通过精心构造的分支序列来“训练”分支预测器,使其偏向某一分支方向。
→ 目的是在真实 victim 代码执行期间造成错误预测。
② 触发投机执行(Speculative Execution)
当 victim 代码遇到分支时,由于预测器的状态“被污染”,CPU 会错误预测路径并投机执行错误路径。
投机路径可能会读取敏感数据(本来不会发生的读取)。
③ 留下微架构泄露(Microarchitectural Side Effects)
错误路径的执行影响 CPU 微架构状态,如加载缓存某些行,改变分支历史缓冲器等。
这些状态并不被体系结构回滚机制撤销,因此可以被外部可测量。
④ 侧信道测量与推断(Side-Channel Observation)
攻击者测量缓存访问时间、分支预测历史等,从这些统计量恢复敏感数据。例如,时间差异表明某个缓存行被 victim 访问过,从而反推 secret value。
常见BP攻击
| 攻击类型 | 攻击原理 | 关键副作用 |
|---|---|---|
| Spectre V2 | 间接分支预测污染 (Branch Target Injection) | 错误返回目标 |
| 分支历史注入(BHI) | 利用分支历史表(BHB)污染预测 | 注入错误历史,引导误预测 |
| BiasScope / Spectre-BHS | 利用不准确的分支历史 | 二级侧信道泄露更高带宽信息 |
BP攻击系统模型
建模目标
零泄露:
或 可控泄露上界:
或 不可达性:
数学模型
1.系统状态定义(Minimal State)
我们定义系统在任意时刻的状态为:
其中:
- A:架构可见状态(寄存器、PC)
- B:分支预测器状态
- M:缓存状态(或更一般的 microarchitectural state)
2.程序模型(Victim + Attacker)
Victim 程序抽象为:
- x:攻击者可控输入
- 𝜙(𝑥):边界检查
:包含对 secret s 的访问(在架构语义下不可达)
投机执行的形式化定义
定义一个投机转移关系:
即:
- 预测器状态
决定下一条路径 - 即使
,仍可能执行
泄露唯一来源
我们定义:
- 唯一可被攻击者观测的量是:
攻击者不能直接观测
攻击成功的定义
攻击成功 ⇔
也即:
攻击证明
在无防御时:
1.存在
2.
3.因此:
⇒
防御策略的形式化建模
防御策略 D:投机不可达性(Speculative Non-Interference, SNI)
防御定义(形式化)
防御 D 保证:
任意投机执行路径中,不允许 secret-dependent memory access
形式化为:
或更直观地:
防御有效性证明
定理(SNI ⇒ 零泄露)
若系统满足 Speculative Non-Interference,则:
证明:
1.攻击者的观测量:
2.根据防御假设:
3.因此:
4.由于
5.得证:
推广
如果
可以推导:
应用举例
BiasScope / Spectre-BHS
根据论文攻击流程(例如 BiasScope):
- 攻击者训练或置入某个分支状态 (Bias-Free BHB 条目)
- Victim 执行某个 secret-dependent 分支
- 攻击者验证 BHB 是否被更新(或被驱逐)
- 从 BHB 记录状态的变化间接推断 secret 值(例如分支是否 taken)
这说明:
投机历史
会依赖 (victim secret branch 状态会修改 BHB)这种修改又会被攻击者通过后续分支行为产生的微结构影响
(比如缓存时间差)
因此模型中的攻击链路存在:
即:
1.Victim secret 影响 BHB 状态
2.攻击者通过自身的推测执行利用 BHB 干扰预测路径
3.推测执行泄露副作用到缓存/时序
4.攻击者测量观察到不同的
为了证明攻击有效,需要证明:
说明:
不同 secret
该差异通过
例如在 BiasScope 中:
Victim 分支 taken 会 evict/update 特定 BHB 条目
攻击者随后执行自己的分支序列
→ 会因 BHB 差异导致预测行为不同
→ 侧信道可测量(如 mis-prediction 计数、cache 影响等)
因此可以构造:
从而:
防御目标
防御策略目标是打断这个链条的一环使得:
IBT
IBT 的硬件语义可以抽象为以下不变式:
形式化定义:
令:
:预测器给出的目标 :所有以 ENDBR 开头的地址集合
IBT 强制:
否则:
speculative execution aborts
防御目标
IBT 不改变预测器 𝐵,但约束预测器对架构状态 𝐴 的影响函数:
变为:
IBT 阻断 BTB-based Spectre-V2
证明:
1.攻击成立的必要条件是存在 gadget 𝐺,使得:
2.IBT强制:
3.若
4.因此不存在:
5.即:
IBT 的“证明边界”
IBT 仅证明:
- 阻断 BTB-target injection
- 阻断 Spectre-V2 gadget 跳转
但 不能证明:
- Branch History Side-Channel
- 条件分支投机(Spectre-V1)
因为: