内核漏洞挖掘技术系列(3)——bochspwn-reloaded(2)
字数 1963 2025-08-05 11:39:30
内核漏洞挖掘技术:bochspwn-reloaded 深度解析
1. 概述
bochspwn-reloaded 是一种基于 x86 模拟和污点追踪的内核信息泄露漏洞检测技术,是内核漏洞挖掘技术系列的重要工具。本文将从设计原理、代码实现到实际应用进行全面解析。
2. 技术背景
2.1 信息泄露漏洞类型
- 未初始化内存泄露:内核未正确初始化内存即将其复制到用户空间
- 内存越界读取:读取超出分配范围的内存区域
- 残留数据泄露:释放后未清除的敏感数据被重新分配使用
2.2 技术发展脉络
- bochspwn:初代技术,基于 Bochs 模拟器
- bochspwn-reloaded:改进版本,增强污点追踪能力
- 后续演进:支持更多架构和场景
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 污点传播规则
- 内核→内核:污点传播
- 用户→内核:清除污点
- 内核→用户:检查污点状态
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 检测流程
- 监控所有内核内存分配
- 标记新分配内存为未初始化状态
- 追踪内存拷贝操作
- 检查内核→用户拷贝中是否包含未初始化数据
- 发现可疑模式时生成报告
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