用侧信道读取特权内存(下)
字数 1900 2025-08-20 18:17:07

侧信道攻击:利用分支目标注入读取特权内存(下)

变体2:分支目标注入攻击详解

攻击流程概述

  1. 定位主机内核组件

    • 确定kvm-intel.ko的低20位地址
    • 获取kvm.ko的完整地址
    • 获取vmlinux的完整地址
  2. 信息泄露技术

    • 通过分支历史缓冲区状态泄露信息
    • 利用间接调用的误预测率测量

详细攻击步骤

1. 泄露kvm-intel.ko地址

技术实现

  • 转储guest输入后的分支历史缓冲区状态
  • 对kvm-intel.ko加载地址的位12..19的每个可能值:
    • 计算历史缓冲区的预期最低16位
    • 与泄露的历史缓冲区状态比较

测量方法

  • 使用两种方式的间接调用:
    1. 从vmcall指令开始,后接N个分支(源和目标地址位均为零)
    2. 用户空间中受控分支序列,可写入任意值到分支历史缓冲区

误预测率测量

  • 使用一个调用目标加载缓存行
  • 另一个检查是否加载了相同缓存行
  • 当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

缓存集识别技术

步骤

  1. 分配25600页内存
  2. 循环选择随机子集:
    • 期望包含驱逐集合的数目为1
    • 通过访问和测试缓存行是否被缓存来减少子集
  3. 使用新驱逐集测试剩余未分类缓存行

查找guest页面的主机虚拟地址

技术要点

  • 使用分支目标注入攻击使管理程序加载攻击者控制地址
  • 使用特定gadget(从R8指定位置加载)
  • 暴力破解方法:
    1. 使用物理地址加载gadget暴力破解物理地址
    2. 暴力破解physmap区域的基地址(1GiB对齐)

优化方法

  • 先暴力破解物理地址(假设远低于128PiB)
  • 再暴力破解physmap基地址

数据泄露实现

eBPF解释器利用

  • 使用__bpf_prog_run()函数执行未验证的eBPF指令
  • 功能包括:
    • 多个64位仿真寄存器
    • 64位立即数写入
    • 内存读取
    • 按位和算术运算

gadget调用

  • 使用特定gadget控制R8-R11、RSI和RIP
  • 将R8和R9指向physmap中客户拥有的页面映射

变体3:恶意数据缓存加载

基本原理

  • 从用户空间读取内核内存而不误导内核控制流
  • 权限检查可能不在关键路径上,允许推测性读取

技术要点

  1. 在高延迟预测错误分支后执行读取指令
  2. 增加读取和异常之间的延迟扩大推测窗口
  3. 系统调用后预取指令可能阻止攻击

进一步研究方向

  1. 无数据缓存时序的泄露

    • 研究其他微架构攻击方法
  2. 其他微架构研究

    • 研究不同现代处理器的分支预测机制
  3. 其他JIT引擎攻击

    • 特别是JavaScript引擎的攻击可行性
  4. 高效扫描技术

    • 先确定L3缓存集合再扫描主机虚拟地址
    • 使用L1D+L2驱逐集驱逐主机内核函数指针
  5. BTB状态转储

    • 转储超级调用产生的完整BTB状态
    • 可能用于识别主机内核函数位置
  6. 高效gadget利用

    • 使用足够高效的gadget可能只需L1D和L2驱逐
  7. 返回预测器利用

    • 研究从VM内部定位主机内核的可能性

供应商声明

  1. 英特尔

    • 承认问题涉及现代微处理器的共同特性
    • 正在与合作伙伴合作开发缓解措施
  2. AMD

    • 提供了相关安全公告链接
  3. ARM

    • 认识到高性能处理器的推测功能可能被利用
    • 开发并推荐部署软件缓解措施

关键参考文献

  1. 英特尔优化手册
  2. Dmitry Evtyushkin等人的分支目标缓冲区研究
  3. Daniel Gruss等人的rowhammer.js研究
  4. Matt Godbolt的英特尔处理器分支预测器逆向工程
  5. Sophia D'Antoine的超线程数据传输研究
  6. Daniel Gruss等人的Kaiser论文

实际攻击中的注意事项

  1. 内核版本依赖性

    • PoC包含许多硬编码地址/偏移量
    • 不同内核版本可能需要调整
  2. 性能优化

    • 当前PoC速度较慢,可优化:
      • 一次泄露更多数据
      • 减少IRETQ使用
  3. 硬件限制

    • 某些PoC不支持SMAP的CPU
    • 但这不是基本限制
  4. 实际攻击时间估算

    • 暴力破解guest页面主机虚拟地址:
      • 每秒12000次成功注入
      • 30个并行测试
      • 约1天完成
侧信道攻击:利用分支目标注入读取特权内存(下) 变体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不支持SMAP的CPU 但这不是基本限制 实际攻击时间估算 : 暴力破解guest页面主机虚拟地址: 每秒12000次成功注入 30个并行测试 约1天完成