用侧信道读取特权内存(下)
字数 1900 2025-08-20 18:17:07
侧信道攻击:利用分支目标注入读取特权内存(下)
变体2:分支目标注入攻击详解
攻击流程概述
-
定位主机内核组件:
- 确定kvm-intel.ko的低20位地址
- 获取kvm.ko的完整地址
- 获取vmlinux的完整地址
-
信息泄露技术:
- 通过分支历史缓冲区状态泄露信息
- 利用间接调用的误预测率测量
详细攻击步骤
1. 泄露kvm-intel.ko地址
技术实现:
- 转储guest输入后的分支历史缓冲区状态
- 对kvm-intel.ko加载地址的位12..19的每个可能值:
- 计算历史缓冲区的预期最低16位
- 与泄露的历史缓冲区状态比较
测量方法:
- 使用两种方式的间接调用:
- 从vmcall指令开始,后接N个分支(源和目标地址位均为零)
- 用户空间中受控分支序列,可写入任意值到分支历史缓冲区
误预测率测量:
- 使用一个调用目标加载缓存行
- 另一个检查是否加载了相同缓存行
- 当N=29且历史缓冲器值为零时,误预测率会很高
2. 定位kvm.ko地址
技术实现:
- 使用通用分支预测器
- 利用从kvm.ko到kvm-intel.ko的间接调用插入BTB的数据
- 搜索范围:0xffffffffc0000000到0xffffffffc4000000(页面对齐)
优化方法:
- 前四项有24-1=15个别名地址
- 将搜索空间从0x4000减少到1024
3. 定位vmlinux地址
技术实现:
- 使用从vmlinux到kvm.ko的间接调用
- vmlinux具有2MiB对齐和1GiB随机化范围(512个可能地址)
- 使用模拟串行端口的状态寄存器进行端口I/O
缓存集识别技术
步骤:
- 分配25600页内存
- 循环选择随机子集:
- 期望包含驱逐集合的数目为1
- 通过访问和测试缓存行是否被缓存来减少子集
- 使用新驱逐集测试剩余未分类缓存行
查找guest页面的主机虚拟地址
技术要点:
- 使用分支目标注入攻击使管理程序加载攻击者控制地址
- 使用特定gadget(从R8指定位置加载)
- 暴力破解方法:
- 使用物理地址加载gadget暴力破解物理地址
- 暴力破解physmap区域的基地址(1GiB对齐)
优化方法:
- 先暴力破解物理地址(假设远低于128PiB)
- 再暴力破解physmap基地址
数据泄露实现
eBPF解释器利用:
- 使用__bpf_prog_run()函数执行未验证的eBPF指令
- 功能包括:
- 多个64位仿真寄存器
- 64位立即数写入
- 内存读取
- 按位和算术运算
gadget调用:
- 使用特定gadget控制R8-R11、RSI和RIP
- 将R8和R9指向physmap中客户拥有的页面映射
变体3:恶意数据缓存加载
基本原理
- 从用户空间读取内核内存而不误导内核控制流
- 权限检查可能不在关键路径上,允许推测性读取
技术要点
- 在高延迟预测错误分支后执行读取指令
- 增加读取和异常之间的延迟扩大推测窗口
- 系统调用后预取指令可能阻止攻击
进一步研究方向
-
无数据缓存时序的泄露:
- 研究其他微架构攻击方法
-
其他微架构研究:
- 研究不同现代处理器的分支预测机制
-
其他JIT引擎攻击:
- 特别是JavaScript引擎的攻击可行性
-
高效扫描技术:
- 先确定L3缓存集合再扫描主机虚拟地址
- 使用L1D+L2驱逐集驱逐主机内核函数指针
-
BTB状态转储:
- 转储超级调用产生的完整BTB状态
- 可能用于识别主机内核函数位置
-
高效gadget利用:
- 使用足够高效的gadget可能只需L1D和L2驱逐
-
返回预测器利用:
- 研究从VM内部定位主机内核的可能性
供应商声明
-
英特尔:
- 承认问题涉及现代微处理器的共同特性
- 正在与合作伙伴合作开发缓解措施
-
AMD:
- 提供了相关安全公告链接
-
ARM:
- 认识到高性能处理器的推测功能可能被利用
- 开发并推荐部署软件缓解措施
关键参考文献
- 英特尔优化手册
- Dmitry Evtyushkin等人的分支目标缓冲区研究
- Daniel Gruss等人的rowhammer.js研究
- Matt Godbolt的英特尔处理器分支预测器逆向工程
- Sophia D'Antoine的超线程数据传输研究
- Daniel Gruss等人的Kaiser论文
实际攻击中的注意事项
-
内核版本依赖性:
- PoC包含许多硬编码地址/偏移量
- 不同内核版本可能需要调整
-
性能优化:
- 当前PoC速度较慢,可优化:
- 一次泄露更多数据
- 减少IRETQ使用
- 当前PoC速度较慢,可优化:
-
硬件限制:
- 某些PoC不支持SMAP的CPU
- 但这不是基本限制
-
实际攻击时间估算:
- 暴力破解guest页面主机虚拟地址:
- 每秒12000次成功注入
- 30个并行测试
- 约1天完成
- 暴力破解guest页面主机虚拟地址: