内核漏洞挖掘技术系列(8)——ioctlbf
字数 1863 2025-08-24 16:48:07

内核漏洞挖掘技术:ioctlbf工具详解

1. 工具概述

ioctlbf是一款专门用于挖掘Windows内核驱动漏洞的工具,主要针对第三方驱动程序。它通过以下两种方式发现漏洞:

  1. 扫描驱动程序支持的IOCTL:不依赖于捕获的IOCTL,能检测驱动程序支持但很少使用的IOCTL
  2. 基于生成的IOCTL fuzz:对发现的IOCTL进行模糊测试

工具优势:

  • 能发现特定条件下调用的IOCTL
  • 能发现用于调试的IOCTL
  • 适用于第三方驱动漏洞挖掘(相比操作系统内核漏洞更容易发现)

2. 工具源码结构

inc/            # 头文件目录
getopt.c        # GNU中的getopt实现
ihm.c           # 打印输出功能
ioctl_bf.c      # fuzzer主要功能实现
ioctl_manipulation.c  # IOCTL列表维护函数
rng.c           # 随机数生成
utilities.c     # 辅助函数(仅包含substr函数)

核心文件:ioctl_bf.c

3. 使用流程

3.1 准备工作

  1. 定位目标驱动

    • 使用DriverView等工具查找目标驱动程序
    • 示例:avira(小红伞)的驱动avdevprot.sys
  2. 检查关联设备

    • 使用DeviceTree检查与目标驱动关联的设备
    • 示例:avdevprot.sys对应的设备avdevprot
  3. 分析IOCTL

    • 方法1:反编译驱动,在IDA中查找switch语句定位IOCTL
      • 操作:File → Produce File → Create C file...
    • 方法2:分析用户态程序调用DeviceIoControl的地方

3.2 运行ioctlbf

基本命令格式:

ioctlbf.EXE -d <deviceName> ( -i <code> | -r <code1>-<code2> ) [options]

参数说明:

参数 描述
-d <deviceName> 设备名(不含\\.\前缀)
-i <code> fuzz指定IOCTL(范围:code到code & 0x00003fff)
-r <code1>-<code2> fuzz指定范围内的IOCTL
-u 仅fuzz -i参数指定的单个IOCTL
-f 过滤掉对缓冲区长度无限制的IOCTL
-q fuzz时不显示hexdumps
-e 扫描IOCTL时显示错误代码
-h 显示帮助信息

4. 技术实现分析

4.1 主要流程

  1. 初始化

    • 解析命令行参数
    • 调用CreateFile打开指定驱动(失败则退出)
  2. IOCTL扫描

    • 对每个IOCTL调用DeviceIoControl
    • 遇到ERROR_ACCESS_DENIEDERROR_NOT_SUPPORTED则跳过
    • 如果设置-f参数:
      • 使用MAX_BUFSIZE(4096字节)测试缓冲区限制
      • 继续测试0/1/2/3字节缓冲区
      • 无限制则跳过该IOCTL
  3. 确定缓冲区范围

    • 通过多次调用DeviceIoControl确定:
      • nInBufferSizenOutBufferSize的最小/最大值
    • 记录到IOCTLlist
  4. 模糊测试阶段

    • 如果没有-u参数,从IOCTLlist选择IOCTL进行fuzz
    • 分四步进行:
      1. 提供无效的内存地址作为缓冲区
      2. 提供比缓冲区小的size参数
      3. 使用预设的DWORD值进行fuzz:
        • 无效地址
        • 指向长ascii/unicode字符串的地址
        • 指向无效地址表的地址
      4. 使用完全随机数据进行fuzz

5. 改进版本:kDriver-Fuzzer

k0shl于2018年发布的改进版本,新增功能:

  • 驱动枚举功能
  • 增强的日志记录功能
  • 项目地址:https://github.com/k0keoyo/kDriver-Fuzzer

6. 实际应用建议

  1. 目标选择

    • 优先选择第三方驱动(代码质量参差不齐,漏洞更容易发现)
    • 安全软件驱动是常见目标(如示例中的avira驱动)
  2. 分析方法

    • 结合静态分析(IDA反编译)和动态fuzz
    • 通过用户态程序分析驱动使用方式
  3. 测试策略

    • 先广泛扫描(-r)再针对性测试(-i)
    • 使用-f参数提高效率
    • 关注返回错误码,分析驱动行为
  4. 结果验证

    • 监控系统稳定性变化
    • 使用调试工具观察异常情况

7. 工具限制

  1. 仅适用于Windows平台
  2. 主要针对通过DeviceIoControl暴露的接口
  3. 需要管理员权限运行
  4. 可能造成系统不稳定,建议在虚拟机环境中使用

8. 扩展学习

本系列其他相关文章:

  1. Trinity:内核fuzz框架
  2. Bochspwn/Reloaded:基于虚拟化的内核漏洞检测
  3. Syzkaller:Linux内核fuzz工具
  4. AFL用于内核fuzz
  5. 静态模式匹配技术

通过结合多种工具和技术,可以构建更全面的内核漏洞挖掘能力。

内核漏洞挖掘技术:ioctlbf工具详解 1. 工具概述 ioctlbf是一款专门用于挖掘Windows内核驱动漏洞的工具,主要针对第三方驱动程序。它通过以下两种方式发现漏洞: 扫描驱动程序支持的IOCTL :不依赖于捕获的IOCTL,能检测驱动程序支持但很少使用的IOCTL 基于生成的IOCTL fuzz :对发现的IOCTL进行模糊测试 工具优势: 能发现特定条件下调用的IOCTL 能发现用于调试的IOCTL 适用于第三方驱动漏洞挖掘(相比操作系统内核漏洞更容易发现) 2. 工具源码结构 核心文件: ioctl_bf.c 3. 使用流程 3.1 准备工作 定位目标驱动 : 使用DriverView等工具查找目标驱动程序 示例:avira(小红伞)的驱动 avdevprot.sys 检查关联设备 : 使用DeviceTree检查与目标驱动关联的设备 示例: avdevprot.sys 对应的设备 avdevprot 分析IOCTL : 方法1:反编译驱动,在IDA中查找switch语句定位IOCTL 操作:File → Produce File → Create C file... 方法2:分析用户态程序调用 DeviceIoControl 的地方 3.2 运行ioctlbf 基本命令格式: 参数说明: | 参数 | 描述 | |------|------| | -d <deviceName> | 设备名(不含 \\.\ 前缀) | | -i <code> | fuzz指定IOCTL(范围:code到code & 0x00003fff) | | -r <code1>-<code2> | fuzz指定范围内的IOCTL | | -u | 仅fuzz -i 参数指定的单个IOCTL | | -f | 过滤掉对缓冲区长度无限制的IOCTL | | -q | fuzz时不显示hexdumps | | -e | 扫描IOCTL时显示错误代码 | | -h | 显示帮助信息 | 4. 技术实现分析 4.1 主要流程 初始化 : 解析命令行参数 调用 CreateFile 打开指定驱动(失败则退出) IOCTL扫描 : 对每个IOCTL调用 DeviceIoControl 遇到 ERROR_ACCESS_DENIED 或 ERROR_NOT_SUPPORTED 则跳过 如果设置 -f 参数: 使用 MAX_BUFSIZE (4096字节)测试缓冲区限制 继续测试0/1/2/3字节缓冲区 无限制则跳过该IOCTL 确定缓冲区范围 : 通过多次调用 DeviceIoControl 确定: nInBufferSize 和 nOutBufferSize 的最小/最大值 记录到IOCTLlist 模糊测试阶段 : 如果没有 -u 参数,从IOCTLlist选择IOCTL进行fuzz 分四步进行: 提供无效的内存地址作为缓冲区 提供比缓冲区小的size参数 使用预设的DWORD值进行fuzz: 无效地址 指向长ascii/unicode字符串的地址 指向无效地址表的地址 使用完全随机数据进行fuzz 5. 改进版本:kDriver-Fuzzer k0shl于2018年发布的改进版本,新增功能: 驱动枚举功能 增强的日志记录功能 项目地址:https://github.com/k0keoyo/kDriver-Fuzzer 6. 实际应用建议 目标选择 : 优先选择第三方驱动(代码质量参差不齐,漏洞更容易发现) 安全软件驱动是常见目标(如示例中的avira驱动) 分析方法 : 结合静态分析(IDA反编译)和动态fuzz 通过用户态程序分析驱动使用方式 测试策略 : 先广泛扫描(-r)再针对性测试(-i) 使用-f参数提高效率 关注返回错误码,分析驱动行为 结果验证 : 监控系统稳定性变化 使用调试工具观察异常情况 7. 工具限制 仅适用于Windows平台 主要针对通过DeviceIoControl暴露的接口 需要管理员权限运行 可能造成系统不稳定,建议在虚拟机环境中使用 8. 扩展学习 本系列其他相关文章: Trinity:内核fuzz框架 Bochspwn/Reloaded:基于虚拟化的内核漏洞检测 Syzkaller:Linux内核fuzz工具 AFL用于内核fuzz 静态模式匹配技术 通过结合多种工具和技术,可以构建更全面的内核漏洞挖掘能力。