深入Spectre V2——跨进程泄露敏感信息
字数 2488 2025-08-26 22:11:14
Spectre V2漏洞分析与利用:跨进程敏感信息泄露
一、幽灵漏洞概述
幽灵(Spectre)漏洞是一类存在于现代处理器分支预测实现中的硬件缺陷,编号CVE-2017-5715(Spectre Variant 2)。该漏洞允许攻击者突破CPU的进程隔离机制,实现跨进程的敏感信息泄露。
核心原理
- 预测执行(Speculative Execution): 现代CPU为提高性能,在遇到分支指令时会预测执行路径
- 分支目标注入(Branch Target Injection): 攻击者可训练受害进程的CPU分支目标预测器
- 缓存侧信道攻击: 通过测量缓存访问时间差异泄露信息
影响范围
几乎所有含预测执行功能的现代处理器都受影响,包括:
- 台式机、笔记本电脑
- 移动设备
- 云服务器
二、攻击目标分解
- 建立隐蔽通信通道:在受害进程中找到可用于信息传递的共享区域
- 定位gadget:找到能将敏感信息传递到隐蔽通道的指令片段
- 训练分支预测器:使受害进程预测执行选定gadget
- 触发预测执行:通过缓存刷新创造预测执行条件
- 信息提取:利用缓存侧信道将隐蔽通道状态转化为原始数据
三、现代CPU关键技术
3.1 乱序执行(Out-of-order Execution)
- 通过多级流水线提高指令并发度
- 对无依赖指令进行乱序调度
- 对外保持顺序提交结果
3.2 预测执行(Speculative Execution)
- 遇到条件分支或间接跳转时预测路径
- 可提前执行数百条指令
- 预测失败时回滚执行结果
3.3 分支预测(Branch Prediction)
- 使用专用缓存记录分支历史
- 多种预测器协同工作
- 预测结果受分支历史影响
3.4 存储结构
- L1 Cache: ~32KB (核心独占)
- L2 Cache: ~256KB (核心独占)
- L3 Cache: ~8MB (共享)
- 内存访问延迟: 200-300周期
关键点:预测执行会影响缓存状态,即使回滚也不会恢复缓存
四、CPU分支预测器详解
4.1 预测器分类
-
分支预测器(Branch Predictor)
- 处理条件分支(if/else)
- 输出"Taken"或"Not Taken"
-
分支目标预测器(Branch Target Predictor)
- 处理间接跳转(call/jmp)
- 输出目标虚拟地址
4.2 Haswell预测机制
-
通用分支预测器(Generic BP)
- 使用分支目标缓存(BTB)
- 31位地址索引,N路组相联
-
间接分支预测器(Indirect BP)
- 两级结构:
- 分支历史缓存(BHB): 58位移位寄存器
- 间接分支目标缓存(IBTB): "标记-目标地址"映射
- 更新算法(逆向工程得到):
void bhb_update(uint58_t *bhb_state, unsigned long src, unsigned long dst) { *bhb_state <<= 2; *bhb_state ^= (dst & 0x3f); *bhb_state ^= (src & 0xc0) >> 6; // 更多位运算... }
- 两级结构:
-
函数返回预测器(Return Predictor)
- 处理ret指令
4.3 预测流程
- PC与BHB异或后哈希得到IBTB索引
- IBPB(2位饱和计数器)决定是否采纳预测
- 双峰选择器决定最终预测地址
关键点:同一核心上的超线程会共享预测器
五、缓存侧信道攻击
5.1 内存页面共享
- 操作系统通过写时复制(Copy-on-Write)共享只读页面
- 动态链接库是典型共享场景
5.2 FLUSH+RELOAD攻击
- 攻击者刷新共享区域缓存
- 受害进程访问共享区域特定位置
- 攻击者测量各缓存行访问时间
- 访问时间短的即为受害进程访问过的位置
示例探测代码:
ProbeTable:
db 0x10000 dup (0) # 256×256数组
secret:
db 'a' # 0x61
xor eax, eax # eax = 0
mov ah, [secret] # ax = 0x6100
mov ebx, ProbeTable[eax] # 字符→位置访问
5.3 缓存测量技术
使用rdtsc和clflush指令测量访存时间:
asm __volatile__ (
"mfence\nlfence\nrdtsc\nlfence\n"
"movl %%eax, %%esi \n"
"movl (%1), %%eax\nlfence\n"
"rdtsc\n"
"subl %%esi, %%eax \n"
"clflush 0(%1)\n"
: "=a" (time)
: "c" (adrs)
: "%esi", "%edx");
六、完整攻击实现
6.1 环境配置
- CPU: Intel i7-4790 (Haswell)
- OS: CentOS 6.9
- 编译选项:
-fno-pie(禁用位置无关代码)
6.2 组件分解
-
victim.c - 受害进程
- 包含敏感数据
secret[128] - 提供网络服务接收/返回数据
- 植入ProbeTable和gadget:
__attribute__((section(".rodata.transmit"), aligned(0x10000))) const char ProbeTable[0x10000] = {'x'}; __asm__(".text\n.globl gadget\ngadget:\n" "xorl %eax, %eax\n" "movb (%rdx), %ah\n" "movl ProbeTable(%eax), %eax\n" "retq\n");
- 包含敏感数据
-
train.c - 训练进程
- 在每个核心上运行实例
- 通过ptrace注入代码毒化分支预测
-
attack.c - 攻击进程
- 映射victim的ProbeTable:
mm = mmap(NULL, 0x10000, PROT_READ, MAP_SHARED, fd, 0x20000); - 实施FLUSH+RELOAD攻击
- 映射victim的ProbeTable:
6.3 关键攻击步骤
-
定位间接分支:victim中的
sprintf@plt调用400800: ff 25 e0 03 23 00 jmpq *0x2303e0(%rip) # 6303e0 <sprintf@got> -
训练分支预测器:
- 注入循环代码训练BTB和BHB
- 使
0x400800处预测跳转到gadget
-
触发预测执行:
- 向victim发送secret地址控制rdx
- 刷新
sprintf@got制造cache miss
-
信息提取:
- 循环探测ProbeTable
- 通过访问时间差异还原secret
七、实际测试结果
在以下平台测试效果:
- i3 2310m (SandyBridge): 部分成功
- i7 4790 (Haswell): 最佳效果
- i7 6700HQ (Skylake): 有限成功
八、改进方向
- 隐蔽通道:使用共享库中的现有区域而非自定义ProbeTable
- gadget选择:从glibc等共享库中寻找合适gadget
- 可靠性提升:优化训练和探测算法减少噪声
九、防御措施
- 微码更新:Intel发布的IBRS/STIBP补丁
- 编译器防护:使用retpoline技术替换间接跳转
- 操作系统隔离:加强进程隔离机制
参考资料
- Understanding Spectre v2 and How the Vulnerability Impact the Cloud Security
- Spectre Attacks: Exploiting Speculative Execution
- Exploiting Branch Target Injection (Jann Horn)
- FLUSH+RELOAD: a High Resolution, Low Noise, L3 Cache Side-Channel Attack
通过深入理解Spectre V2的原理和实现细节,我们可以更好地防御这类硬件级漏洞,同时也能在安全研究中应用相关技术。