CVA6 BP(Branch-Prediction)建模分析
CVA6 Branch Prediction
BPU(动态分支预测单元)
CVA6 在 PC 生成阶段 实现分支预测逻辑,包括:
- Branch Target Buffer (BTB):用于预测跳转目标地址
- Branch History Table (BHT):用于预测条件分支是否 taken/not taken
- Return Address Stack (RAS):用于函数返回预测


攻击路线分析
我们用先前定义的简化模型来分析 CVA6 中的侧信道可能:
①条件分支预测泄露(类 Spectre-V1 攻击)
CVA6 的 BHT 存储历史分支信息,用于预测 taken/not taken;因此:
1.Victim 对某个条件分支执行时,secret 输入可能会 影响条件分支的实际outcome;
2.BHT 会根据 outcome 更新其状态 𝐵;
3.攻击进程可以构造分支序列,使得在同一核心/线程上共享分支历史状态;
4.通过测量缓存访问时间等微架构侧信号 𝑂,推断不同 secret 导致的历史差异;
5.这构成一个 标准的侧信道:
②BTB 目标预测与 BHI(Branch History Injection)类攻击
BTB 存储分支目标地址;BHT 存储 taken/not taken 信息。若攻击者能够:
调用/训练 CVA6 的 BTB 或 BHT 进入某种历史状态
Victim 进程执行 secret-dependent control flow
则同样存在:
其中 B 对 secret 的差异体现在预测态和 mis-prediction 行为上,进而影响微架构状态。
③Return 地址预测带来的历史泄露
RAS 存储返回地址栈,用于预测函数返回。返回地址的预测错误同样会:
在误预测时创建微架构差异(pipeline flush、cache 影响)
这些差异可以通过时间侧信道 𝑂 进行探测
因此 RAS 同样可能成为侧信道的一环。
形式化攻击建模
我们重申模型中的关键变量:
𝐵:预测器状态(包括 BHT、BTB、RAS 表项)
𝑀:微架构状态(如 CPU 缓存时间)
𝑂:观测值(攻击者可测量的时间/side-channel)
攻击成立条件为:
我们可以将攻击链路分解:
1.Secret 影响 victim 代码中的条件或间接分支 outcome
2.该 branch outcome 导致 BHT/BTB/RAS 发生不同更新
3.随后攻击者利用自己的分支序列在同一个分支预测状态空间内激活这些差异,并产生不同的微架构行为
4.攻击者测量 𝑂,例如计时差异、cache 状态,推断 secret
可能的实际攻击
条件分支侧信道(Spectre-V1)
- Victim 中 secret 决定某个条件分支 taken/not taken
- 该分支 outcome 更新 BHT
- 攻击者通过训练 BHT 并观测其预测变化,推测 secret
目标预测侧信道(BHT + BTB)
- Victim 中 secret 影响某跳转目标或返回序列
- 该历史影响 BTB/RAS 状态
- 攻击者利用自己控制的 branch 指令访问 BTB/RAS
- 差异通过 mis-prediction 或 fetch timing 表现出来
潜在防御方向
1)隔离或清理预测历史(B ⟂ s)
如果在跨安全域(例如用户/内核、保护域)切换时清理 BHT/BTB/RAS 状态,则:
这是 Speculative Non-Interference(SNI)的一种实现。
2) 代码层屏障
例如在敏感分支前插入 fence/barrier,使得误预测不会将 secret 带入预测器状态或不会产生可侧信号的时序行为。