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驱动分析, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 内核安全, 内核漏洞利用, 函数指针, 块设备, 字符设备, 属性验证, 平台驱动, 情报收集, 模块入口, 漏洞研究, 网络安全, 网络驱动, 输入设备, 逆向工具, 逆向工程, 隐私保护, 静态分析, 驱动程序漏洞