内核漏洞挖掘技术系列(3)——bochspwn-reloaded(2)
字数 1963 2025-08-05 11:39:30

内核漏洞挖掘技术:bochspwn-reloaded 深度解析

1. 概述

bochspwn-reloaded 是一种基于 x86 模拟和污点追踪的内核信息泄露漏洞检测技术,是内核漏洞挖掘技术系列的重要工具。本文将从设计原理、代码实现到实际应用进行全面解析。

2. 技术背景

2.1 信息泄露漏洞类型

  • 未初始化内存泄露:内核未正确初始化内存即将其复制到用户空间
  • 内存越界读取:读取超出分配范围的内存区域
  • 残留数据泄露:释放后未清除的敏感数据被重新分配使用

2.2 技术发展脉络

  1. bochspwn:初代技术,基于 Bochs 模拟器
  2. bochspwn-reloaded:改进版本,增强污点追踪能力
  3. 后续演进:支持更多架构和场景

3. 系统架构

3.1 目录结构

bochspwn-reloaded/
├── third_party/instrumentation/  # 基础内存接口
│   ├── linux-x86/
│   ├── windows-x64/
│   ├── windows-x86/
│   └── windows-x86-markers/
├── instrumentation/  # 核心插桩逻辑
│   ├── linux-x86/
│   ├── windows-x64/
│   ├── windows-x86/
│   └── windows-x86-markers/
└── configs/  # 配置文件
    ├── config-linux-x86.txt
    ├── config-windows-x64.txt
    ├── config-windows-x86.txt
    └── config-windows-x86-markers.txt

3.2 支持平台

  • linux-x86: 32位Linux内核检测
  • windows-x86: 32位Windows内核检测
  • windows-x64: 64位Windows内核检测
  • windows-x86-markers: 文件系统/网络等特定内存泄露检测

4. 核心组件实现

4.1 内存接口 (mem_interface.h/cc)

提供基础内存操作函数:

// 从指定虚拟地址读取数据
void read_lin_mem(BX_CPU_C *cpu, Bit32u addr, Bit8u *buf, unsigned len);

// 向指定虚拟地址写入数据
void write_lin_mem(BX_CPU_C *cpu, Bit32u addr, Bit8u *buf, unsigned len);

4.2 关键插桩函数

4.2.1 初始化与清理

bx_instr_initialize();  // 初始化检测环境
bx_instr_exit();        // 清理资源

4.2.2 中断处理

bx_instr_interrupt();   // 发现漏洞时触发中断
invoke_guest_int3();    // 保存原值并写入0xCC(INT3)

4.2.3 执行监控

bx_instr_before_execution();  // 指令执行前处理
bx_instr_after_execution();   // 指令执行后处理
bx_instr_lin_access();        // 内存访问监控

4.3 污点追踪系统 (taint.cc/h)

4.3.1 内存分配追踪

  • 记录分配大小和标志
  • 标记新分配内存为"污点"状态
  • 追踪内存释放操作

4.3.2 污点传播规则

  1. 内核→内核:污点传播
  2. 用户→内核:清除污点
  3. 内核→用户:检查污点状态

4.3.3 Windows特定实现

initialize() {
    // 使用异常分配机制实现Memory overcommitment
    // 允许分配大量虚拟内存用于污点标记
}

5. 平台特定实现细节

5.1 Linux-x86实现

  • 处理内核内存分配函数:
    kmalloc(), vmalloc(), kfree(), vfree()
    kmem_cache_create(), kmem_cache_alloc(), kmem_cache_free()
    
  • 动态缓存构造函数断点设置
  • 特殊指令处理(prefetcht1/prefetcht2)

5.2 Windows-x86实现

  • 主要处理ExAllocatePoolWithTag函数
  • 处理xchg eax, esp__SEH_prolog4/__SEH_prolog4_GS特殊情况

5.3 Windows-x64实现

  • 内存拷贝处理:
    handle_memcpy() {
        // 区分三种内存拷贝场景
        if(内核→内核) 污点传播;
        if(用户→内核) 清除污点;
        if(内核→用户) 检查未初始化字节;
    }
    
  • 系统调用处理(bx_instr_wrmsr)
  • 池分配追踪

6. 漏洞检测逻辑

6.1 检测流程

  1. 监控所有内核内存分配
  2. 标记新分配内存为未初始化状态
  3. 追踪内存拷贝操作
  4. 检查内核→用户拷贝中是否包含未初始化数据
  5. 发现可疑模式时生成报告

6.2 报告生成

  • 记录漏洞上下文(调用栈、寄存器状态)
  • 可选触发断点进行深入分析
  • 符号化处理(Windows平台)

7. 其他信息泄露漏洞挖掘方法

7.1 静态分析

  • Linux:源代码分析
  • Windows:二进制分析

7.2 代码审计

  • Linux:审计所有copy_to_user调用
  • Windows:审计ProbeForWrite上下文

7.3 内核版本对比

  • 比较不同Windows版本相同功能的实现
  • 查找新增的初始化操作(memset等)

7.4 双次系统调用法

  1. 用户态程序进行两次相同系统调用
  2. 比较输出结果
  3. 查找变化但偏移相同的字节

7.5 无污点追踪的插桩

  • 检查所有内核→用户的内存写操作
  • 搜索内核指针等敏感信息
  • 或使用特殊标记字节检测

8. 技术演进与防御

  • Windows从18980版本开始实现ring 0和hyper V代码的默认初始化
  • 未来趋势:编译器/语言级别的强制初始化
  • 防御建议:
    • 启用所有内存初始化警告
    • 使用静态分析工具
    • 实施安全编码规范

9. 实践指南

9.1 环境搭建

  1. 获取Bochs 2.6.9源码
  2. 复制对应平台的instrumentation文件
  3. 配置相应config文件
  4. 编译定制版Bochs

9.2 典型工作流程

  1. 启动目标系统镜像
  2. 运行测试用例或正常系统操作
  3. 监控控制台输出或日志文件
  4. 分析报告的可疑内存泄露

9.3 调试技巧

  • 使用config-windows-x86-markers.txt检测特定子系统泄露
  • 调整污点标记粒度平衡性能与准确性
  • 结合符号调试信息定位问题代码

10. 参考资料

  1. Bochspwn漏洞挖掘技术深究(2):内核未初始化漏洞检测
  2. Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking
  3. Bochspwn Revolutions: Further Advancements in Detecting Kernel Infoleaks
  4. Bochspwn Reloaded: Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking
内核漏洞挖掘技术:bochspwn-reloaded 深度解析 1. 概述 bochspwn-reloaded 是一种基于 x86 模拟和污点追踪的内核信息泄露漏洞检测技术,是内核漏洞挖掘技术系列的重要工具。本文将从设计原理、代码实现到实际应用进行全面解析。 2. 技术背景 2.1 信息泄露漏洞类型 未初始化内存泄露:内核未正确初始化内存即将其复制到用户空间 内存越界读取:读取超出分配范围的内存区域 残留数据泄露:释放后未清除的敏感数据被重新分配使用 2.2 技术发展脉络 bochspwn:初代技术,基于 Bochs 模拟器 bochspwn-reloaded:改进版本,增强污点追踪能力 后续演进:支持更多架构和场景 3. 系统架构 3.1 目录结构 3.2 支持平台 linux-x86: 32位Linux内核检测 windows-x86: 32位Windows内核检测 windows-x64: 64位Windows内核检测 windows-x86-markers: 文件系统/网络等特定内存泄露检测 4. 核心组件实现 4.1 内存接口 (mem_ interface.h/cc) 提供基础内存操作函数: 4.2 关键插桩函数 4.2.1 初始化与清理 4.2.2 中断处理 4.2.3 执行监控 4.3 污点追踪系统 (taint.cc/h) 4.3.1 内存分配追踪 记录分配大小和标志 标记新分配内存为"污点"状态 追踪内存释放操作 4.3.2 污点传播规则 内核→内核:污点传播 用户→内核:清除污点 内核→用户:检查污点状态 4.3.3 Windows特定实现 5. 平台特定实现细节 5.1 Linux-x86实现 处理内核内存分配函数: 动态缓存构造函数断点设置 特殊指令处理(prefetcht1/prefetcht2) 5.2 Windows-x86实现 主要处理 ExAllocatePoolWithTag 函数 处理 xchg eax, esp 和 __SEH_prolog4/__SEH_prolog4_GS 特殊情况 5.3 Windows-x64实现 内存拷贝处理: 系统调用处理( bx_instr_wrmsr ) 池分配追踪 6. 漏洞检测逻辑 6.1 检测流程 监控所有内核内存分配 标记新分配内存为未初始化状态 追踪内存拷贝操作 检查内核→用户拷贝中是否包含未初始化数据 发现可疑模式时生成报告 6.2 报告生成 记录漏洞上下文(调用栈、寄存器状态) 可选触发断点进行深入分析 符号化处理(Windows平台) 7. 其他信息泄露漏洞挖掘方法 7.1 静态分析 Linux:源代码分析 Windows:二进制分析 7.2 代码审计 Linux:审计所有 copy_to_user 调用 Windows:审计 ProbeForWrite 上下文 7.3 内核版本对比 比较不同Windows版本相同功能的实现 查找新增的初始化操作(memset等) 7.4 双次系统调用法 用户态程序进行两次相同系统调用 比较输出结果 查找变化但偏移相同的字节 7.5 无污点追踪的插桩 检查所有内核→用户的内存写操作 搜索内核指针等敏感信息 或使用特殊标记字节检测 8. 技术演进与防御 Windows从18980版本开始实现ring 0和hyper V代码的默认初始化 未来趋势:编译器/语言级别的强制初始化 防御建议: 启用所有内存初始化警告 使用静态分析工具 实施安全编码规范 9. 实践指南 9.1 环境搭建 获取Bochs 2.6.9源码 复制对应平台的instrumentation文件 配置相应config文件 编译定制版Bochs 9.2 典型工作流程 启动目标系统镜像 运行测试用例或正常系统操作 监控控制台输出或日志文件 分析报告的可疑内存泄露 9.3 调试技巧 使用 config-windows-x86-markers.txt 检测特定子系统泄露 调整污点标记粒度平衡性能与准确性 结合符号调试信息定位问题代码 10. 参考资料 Bochspwn漏洞挖掘技术深究(2):内核未初始化漏洞检测 Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking Bochspwn Revolutions: Further Advancements in Detecting Kernel Infoleaks Bochspwn Reloaded: Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking