Whispergate/BinjaKernelTools
GitHub: Whispergate/BinjaKernelTools
Binary Ninja插件集,用于静态分析Linux和Windows内核驱动中的漏洞。
Stars: 0 | Forks: 0
# Binja内核Tools
面向Linux和Windows内核驱动漏洞研究的Binary Ninja静态分析插件。
## 安装
将 `BinjaKernelTools/` 目录复制到你的Binary Ninja插件文件夹:
| 平台 | 路径 |
|---|---|
| Windows | `%APPDATA%\Binary Ninja\plugins\` |
| Linux | `~/.binaryninja/plugins/` |
| macOS | `~/Library/Application Support/Binary Ninja/plugins/` |
需要 Binary Ninja >= 3164 且使用 Python 3 API。
## 插件参考
### Linux 驱动分析
在 **Linux 驱动分析\\** 下注册的命令。
#### 查找模块入口
**`linux/find_module_entry.py`**
定位 `init_module` / `cleanup_module` 并推断驱动类型。
- 符号查找 (`init_module`, `cleanup_module`)
- 段扫描 (`.init.text`, `.exit.text`)
- API 评分启发式 - 根据注册 API 调用对所有函数进行排名
- 驱动类型推断:字符设备、杂项设备、PCI、USB、网络、平台设备、块设备、输入设备
#### 查找字符设备
**`linux/find_char_dev.py`**
枚举字符设备注册并恢复 `file_operations` 函数指针表。
- 追踪 `register_chrdev`, `cdev_init`, `misc_register` 参数至 `file_operations` 结构体
- 读取已知 x86_64 偏移量处的所有函数指针槽位 (`+0x48` `unlocked_ioctl` 等)
- 将已解析的 `sub_*` 函数重命名为 `fops_`
- 数据符号扫描查找名为 `*fops*` / `*file_operations*` 的结构体
#### 查找 IOCTLs
**`linux/find_ioctls.py`**
枚举 IOCTL 处理程序并解码 Linux `_IOC(dir, type, nr, size)` 代码。
- 多策略处理程序检测:名称模式 → 数据符号 → switch 常量扫描
- 完整 `_IOC` 解码:方向 (`_IO`/`_IOR`/`_IOW`/`_IOWR`)、类型字节、编号、大小
- 每个 IOCTL:标记在无 `access_ok` 检查下使用 `copy_from_user`,缺少 `capable()` 检查
#### 查找 Netlink 接口
**`linux/find_netlink.py`**
查找经典 netlink 和通用 netlink 处理程序;检测属性验证失败。
- `netlink_kernel_create` → `.input()` 回调解析
- `genl_register_family` → `genl_ops.doit` / `.dumpit` 枚举
- 使用 NULL 策略的 `nla_parse()` - 无属性类型/长度强制执行
- 在负载访问前缺少 `nlmsg_ok()`(截断消息导致越界读取)
- 在失败/未检查的 `nla_parse` 后对未检查的 `tb[]` 条目使用 `nla_get_*`
- 特权处理程序中缺少 `CAP_NET_ADMIN` / `netlink_capable()` 门控
#### 查找 Procfs/Sysfs 接口
**`linux/find_procfs.py`**
查找 procfs、sysfs 和 debugfs 的写入/存储/显示处理程序;检测缺少边界检查。
- `proc_create` / `proc_create_data` / `debugfs_create_file` 处理程序解析
- `sysfs_create_file` / `device_create_file` 注册跟踪
- 写入处理程序:无计数上限的 `copy_from_user` → 栈/堆溢出
- 写入处理程序:无边界的 `kmalloc(count)` → 用户控制的分配大小
- 忽略 `kstrtol` / `kstrtoul` 返回值 → 后续逻辑中使用陈旧值
- sysfs `.store()` 缺少对 `count` 的 PAGE_SIZE 上限
- 非字面格式字符串的 `seq_printf` → 格式字符串注入
#### 漏洞查找器
**`linux/vuln_finder.py`**
对所有函数进行综合静态分诊。报告保存到 `~/.logs/LKDriverVulns/`。
| # | 检查项 | 严重性 |
|---|---|---|
| 1 | `copy_from_user` 使用用户控制的大小,无边界检查 | 高 |
| 2 | `__copy_from_user` 未先执行 `access_ok()` | 高 |
| 3 | 忽略 `copy_from_user` 返回值 | 中 |
| 4 | `kmalloc` 中的整数溢出:`count * size` 未使用安全算术 | 高 |
| 5 | `kmalloc` 结果在解引用前未进行 NULL 检查 | 中 |
| 6 | 将 `kmalloc` (非 `kzalloc`) 缓冲区传递给 `copy_to_user` - 信息泄露 | 高 |
| 7 | `commit_creds(prepare_kernel_cred(0))` - 权限提升原语 | 高 |
| 8 | 敏感操作缺少 `capable()` / `ns_capable()` 门控 | 高/中 |
| 9 | `remap_pfn_range` 无 `vm_area` 大小边界检查 | 高 |
| 10 | `remap_pfn_range` 中的 `vm_pgoff` 未经验证 - 任意 pfn | 高 |
| 11 | `ioremap` 使用用户派生的 size/address | 高 |
| 12 | `kfree` 后可能使用已释放指针 | 中 |
| 13 | `printk %p` (非 `%pK`) - 内核地址泄露至 dmesg | 中 |
| 14 | `copy_to_user(&struct, sizeof)` - 填充/指针字段泄露 | 低 |
| 15 | 危险函数:`sprintf`, `strcpy`, `strcat`, `vsprintf` | 高/中 |
| 16 | 在 `spin_lock_irqsave` 上下文中使用 `GFP_KERNEL` - 必须使用 `GFP_ATOMIC` | 高 |
| 17 | 双重获取 TOCTOU:同一用户指针被获取 2 次以上且未加锁 | 高 |
| 18 | 有符号性混淆:在复制/分配前使用 `(int)user_len` 或有符号的 `< 0` 检查 | 中 |
| 19 | `kref_put` / `kobject_put` 后使用对象 - 引用计数 UAF | 高/低 |
### Windows 驱动分析
在 **Windows 驱动分析\\** 下注册的命令。
#### 查找设备名称
**`windows/win_find_device_name.py`**
扫描 Windows 设备名称字符串。
- 二进制字符串扫描:`\Device\`, `\DosDevices\`, `\\.\`, `\??\`
- 在 `IoCreateSymbolicLink`, `RtlInitUnicodeString`, `IoCreateDevice` 的调用者中进行 HLIL 扫描
#### 查找 IOCTLs
**`windows/win_find_ioctls.py`**
枚举 `IRP_MJ_DEVICE_CONTROL` 分派例程并解码 `CTL_CODE`。
- 4 策略分派检测:HLIL `MajorFunction[0xe]` 赋值 → 名称启发式 → C++ 类模式 → 后备
- 完整 `CTL_CODE` 解码:`DeviceType`, `Access`, `Function`, `Method`
- 明确标记 `METHOD_NEITHER` - 原始用户指针,无内核缓冲
#### 查找 IRP 处理程序
**`windows/find_irp_handlers.py`**
枚举所有 28 个 `IRP_MJ_*` 分派槽并执行深度 `METHOD_NEITHER` 分析。
- 扫描 HLIL 查找所有 `MajorFunction[]` 偏移处的 `*(drv_obj + 0xNN) = &handler`
- 每个 IRP 类型输出风险排名及安全说明
- `IRP_MJ_READ` / `IRP_MJ_WRITE`:标记在未执行 `ProbeForRead/Write` 的情况下访问 `UserBuffer`
- **METHOD_NEITHER 深度分析:**
- `Type3InputBuffer` 缺少 `ProbeForRead` / `ProbeForWrite`
- 缺少 `__try` / `__except` - 无效指针导致蓝屏
- 写回前未验证 `OutputBufferLength` - 内核溢出
- 从 `Type3InputBuffer` 执行 `memcpy` / `RtlCopyMemory` 未进行探测
#### 漏洞查找器
**`windows/win_vuln_finder.py`**
Windows 内核驱动的全面静态分诊。报告保存到 `~/.logs/WinDriverVulns/`。
- DriverEntry 检测(精确 + 启发式评分)
- 设备名称发现
- 通过 MLIL 参数分析提取池标签
- 危险操作码:`rdmsr`, `wrmsr`, `rdpmc`
- 危险 C 函数:`sprintf`, `strcpy`, `memcpy`, `RtlCopyMemory`
- Windows 内核 API 清单:`Mm*`, `Zw*`, `Io*`, `Flt*`, `Se*`, `ProbeFor*`
- IOCTL 枚举(分派启发式)
- 物理内存 / IO 空间:`MmMapIoSpace`, `MmCopyMemory`, `ZwOpenSection`, MDL 映射
- 来自 IOCTL 上下文的端口/寄存器 IO:`READ_PORT_*`, `WRITE_PORT_*`
- 未执行 `ProbeForRead/Write` 的用户复制:`memcpy` / `RtlCopyMemory` 接近用户缓冲区
- 来自用户输入的 `ExAllocatePool` 大小计算中的整数溢出,未使用 `RtlULong*`
- 敏感操作前缺少 `SeSinglePrivilegeCheck` / `SeAccessCheck`
- 驱动类型检测:标准 WDM vs 微型过滤器
## 许可证
BSD 2-Clause - 版权所有 (c) 2026, Whispergate
标签:0day挖掘, access_ok, Binary Ninja插件, capable(), file_operations, IOCTL分析, _IOC解码, Linux驱动分析, misc_register, Netlink接口, PCI驱动, USB驱动, Windows驱动分析, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 内核安全, 内核漏洞利用, 函数指针, 块设备, 字符设备, 属性验证, 平台驱动, 情报收集, 模块入口, 漏洞研究, 网络安全, 网络驱动, 输入设备, 逆向工具, 逆向工程, 隐私保护, 静态分析, 驱动程序漏洞