本文笔者将基于Spectre攻击中的V1,V2,V4这三个变种,来尝试对Spectre类攻击建立抽象模型,并基于模型构思Spectre类攻击可能的防护方式
Spectre攻击建模
该类攻击的本质为处理器的预测执行(Speculative execution)和微架构侧信道之间的配合联动,从而导致用户信息泄露。
目前笔者研究的三个Spectre攻击变种,其大体逻辑与攻击流程见下表
| 变体 | 名称 | 核心机制 | 攻击条件 & 流程 |
|---|---|---|---|
| v1 | Bounds Check Bypass (边界检查绕过) | 条件分支预测 (Conditional Branch Prediction) | 条件 :代码中存在 if (x < array1_size)之类的边界检查。 流程 :1. 攻击者训练分支预测器(多次输入合法的 x),使其倾向于预测“跳转成立”。2. 攻击者输入越界的 x。3. CPU预测检查通过,推测执行越界读取 array1[x](秘密数据),并将其作为索引访问 array2(ASCII字符 256*CachelineSize)。4. array2 的特定Cache Line被加载。5. CPU发现预测错误,回滚状态,但Cache变化保留。 |
| v2 | Branch Target Injection (分支目标注入) | 间接分支预测 (Indirect Branch Prediction) | 条件 :存在间接跳转指令(如虚函数调用、函数指针),且攻击者能操控BTB(分支目标缓冲)。 流程 : 1. 攻击者污染BTB,让CPU误以为某个间接跳转的目标是攻击者指定的“Gadget代码”(通常存在于共享库中)。 2. 受害者执行该跳转时,CPU推测执行跳转到Gadget。 3. Gadget代码执行类似v1的侧信道操作。 4. 预测失败回滚,但cache泄露完成。 |
| v4 | Speculative Store Bypass (推测性存储绕过) | 内存依赖预测 (Memory Disambiguation) | 条件 :后序的Load指令依赖前序的Store指令,但地址计算尚未完成。 流程 : 1. 内存依赖预测器(Memory Disambiguation Predictor)猜测当前的Load与之前的Store 无关 (地址不冲突)。 2. CPU允许Load指令 提前(乱序)执行 ,读取了旧的内存值(或错误值)。 3. 利用该值进行侧信道访问。 4. 地址计算完成,发现冲突,回滚。 |
综合以上变种运用条件,我们可以抽象出该类攻击达成所必须满足的核心要素:
- 预测执行 : 存在一个短暂、会被丢弃的窗口期,在这个期间内,投机操作可以获取不被允许的秘密信息
- 微架构组件的共享特性: 在预测执行结束以后,基于cache、分支预测器等组件的共享特性,其内部状态将会出现对应变化
基于该条件细化条件为状态机
graph TB
%% 8.8.0 兼容修复版:移除敏感字符
subgraph Attacker_Domain [攻击者域]
InputGen[1. 输入生成与训练]
Probe[5. 侧信道探测]
Analysis[6. 统计分析与去噪]
SecretRecovered((秘密恢复))
end
subgraph CPU_Core [处理器微架构]
subgraph Frontend [前端预测单元]
PHT[PHT或BTB状态]
Prediction{预测逻辑}
end
subgraph Execution [执行引擎]
NormalPath[正常路径]
TransientPath[瞬态路径]
Squash[回滚机制]
end
subgraph Backend [后端资源]
Regs[寄存器-可回滚]
Cache[Cache-持久化]
end
end
%% 攻击流程连接
InputGen --训练欺骗--> PHT
PHT --误导--> Prediction
Prediction --Check Pass--> NormalPath
Prediction --Speculative execution 条件1--> TransientPath
TransientPath --访问秘密--> Cache
NormalPath --正常访问--> Cache
TransientPath --触发--> Squash
Squash --恢复--> Regs
Squash --不恢复--> Cache
%% 侧信道提取
Cache --条件2 共享资源区域残留数据--> Probe
Probe --原始数据--> Analysis
Analysis --多次采样--> SecretRecovered
%% 样式
style TransientPath fill:#f96,stroke:#333
style Cache fill:#9cf,stroke:#333
style Analysis fill:#f96,stroke:#333,color:#fff
四步解析:
- Trigger: attacker构造特殊输入序列或反复执行特殊数据,训练CPU的预测器
- Predict: CPU基于错误经验,遇到非法输入,或存在未知数据时,mis-predict错误路径,进入瞬态窗口
- Side Effect :瞬态窗口中所读取到的secret将通过代码逻辑,转换为架构上的某一状态(例如Cache痕迹)。
- Persistence :CPU 与真实程序流对比后发现预测错误,Rollback了寄存器等逻辑状态,但未清除架构状态 (Cache 残留),实现了瞬态窗口的信息留存。