devianntsec/CVE-2024-51324

GitHub: devianntsec/CVE-2024-51324

针对 CVE-2024-51324 百度杀毒驱动 BYOVD 漏洞的硕士论文研究项目,包含完整利用工具、三个 IOCTL 原语的逆向分析以及配套检测规则。

Stars: 0 | Forks: 0

# CVE-2024-51324 — BYOVD: BdApiUtil64.sys · 硕士论文研究 [![Platform](https://img.shields.io/badge/Platform-Windows-blue)](https://nvd.nist.gov/vuln/detail/CVE-2024-51324) [![Language](https://img.shields.io/badge/Language-Python-informational)](https://github.com/devianntsec) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Research](https://img.shields.io/badge/Research-Master's%20Thesis-purple)](https://github.com/devianntsec) [![CVSS](https://img.shields.io/badge/CVSS-3.8%20(Low)-orange)](https://nvd.nist.gov/vuln/detail/CVE-2024-51324)

将存在漏洞的驱动程序加载到内核中(LOADER 模式)

## 描述 本代码仓库包含我关于 **CVE-2024-51324** 的 **硕士论文研究**,这是百度杀毒内核驱动程序 `BdApiUtil64.sys` 中的一个 **自带易受攻击驱动程序 (BYOVD)** 漏洞。 NVD 记录分配的 CVSS v3.1 基础评分为 **3.8(低)**,向量为 `AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N`,CWE-269(不当权限管理)。 该分数并未反映本研究中记录的本地攻击实际情况:一旦该驱动程序被管理员加载(这是一个一次性步骤,可通过社会工程学或任何本地权限提升实现),任何后续进程——包括沙盒或标准用户进程——都可以在无需进一步权限检查的情况下发送 IOCTL。 研究者评估的 CVSS v3.1 评分为 **7.8(高)**,向量为 `AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`,更准确地反映了加载后的利用实际情况。技术文档中对这两个分数都进行了讨论。 该驱动程序创建了设备对象 `\Device\BdApiUtil`,其 `SecurityDescriptor = NULL`,允许任何进程无论完整性级别如何都能打开句柄并发送 IOCTL。通过 Ghidra 11.0.3 进行的静态分析揭示了其内部机制比先前记录的更为重要:该驱动程序使用 `PsLookupProcessByProcessId` + `ObOpenObjectByPointer(KernelMode)` 而非 `ZwOpenProcess`,完全绕过了 `SeAccessCheck`。三个 IOCTL 原语已被完全表征,其中两个此前没有公开文档记录。 ### 我的贡献 | 方面 | 描述 | |--------|-------------| | **技术纠正** | 导入表中不存在 `ZwOpenProcess`;实际机制是 `PsLookupProcessByProcessId` + `ObOpenObjectByPointer(KernelMode)`,它无条件绕过 `SeAccessCheck` | | **三个已记录原语** | 进程终止 (`0x800024B4`)、任意文件删除 (`0x80002648`) 以及通过绕过 `SectionObjectPointer` 实现的占用中文件删除 (`0x8000264C`) —— 最后两个没有先前的公开文档记录 | | **四种操作模式** | LOADER、KILLER、SCANNER 和 CLEANUP —— 完整的生命周期管理 | | **SHA-256 验证** | 在任何加载尝试之前验证驱动程序哈希 | | **PPL 经验测试** | 每个进程类别 10 次尝试,确认 PPL 是唯一的运行时缓解措施 | | **取证分析** | 清理后 Event ID 7045 持续存在;Event ID 1102 作为自我归罪的日志清除痕迹 | | **检测规则** | Sigma 规则和 Sysmon 配置(通过哈希的 Event ID 6 + 通过注册表项的 Event ID 13) | | **CVSS 重新评估** | 记录了官方 NVD 评分(3.8 低)与研究者评估的本地利用严重性(7.8 高)之间的差异 | ## 代码仓库结构 ``` CVE-2024-51324/ ├── README.md ├── LICENSE │ ├── drivers/ │ └── BdApiUtil64.sys # Driver (not distributed) │ ├── exploit/ │ ├── exploit-explanation.md │ └── byovd_killer.py # Main exploit — 4 operational modes │ └── docs/ ├── screenshots/ │ ├── 01-byovd-scan.png │ ├── 02-byovd-scan-target.png │ ├── 03-byovd-load.png │ ├── 04-byovd-load-custom.png │ ├── 05-kill-name.gif │ ├── 06-kill-pid.gif │ ├── 07-kill-limit.gif │ ├── 08-dry-run.gif │ └── 09-byovd-cleanup.png │ └── analysis/ ├── 01-root-cause.md ├── 02-driver-analysis.md # Full Ghidra RE, three primitives, PPL testing └── 03-timeline.md ``` ## 快速开始 ### 前置条件 - Windows 10/11(任何版本) - Python 3.6+ - `BdApiUtil64.sys`(SHA-256:`47EC51B5F0EDE1E70BD66F3F0152F9EB536D534565DBB7FCC3A05F542DBE4428`) - 管理员账户(仅限 LOADER 和 CLEANUP 模式) - 驱动程序加载后,标准用户账户即可用于 KILLER 模式 ### 第 1 步 — 扫描系统 ``` python exploit/byovd_killer.py --scan python exploit/byovd_killer.py --scan --target lsass.exe ``` ### 第 2 步 — 加载驱动程序(需要管理员权限) ``` python exploit/byovd_killer.py --load python exploit/byovd_killer.py --load --driver C:\path\to\BdApiUtil64.sys python exploit/byovd_killer.py --load --service-name MyService ``` ### 第 3 步 — 终止进程(无需管理员权限) ``` python exploit/byovd_killer.py --kill notepad.exe python exploit/byovd_killer.py --pid 1234 python exploit/byovd_killer.py --kill notepad.exe --max-instances 2 python exploit/byovd_killer.py --kill notepad.exe --dry-run ``` ### 第 4 步 — 清理(需要管理员权限) ``` python exploit/byovd_killer.py --cleanup python exploit/byovd_killer.py --cleanup --service-name MyService ``` ## 操作模式 | 模式 | 命令 | 权限 | 描述 | |------|---------|------------|-------------| | **SCANNER** | `--scan` | 任何用户 | 系统和驱动程序状态信息 | | **LOADER** | `--load` | 管理员 | 通过内核服务创建加载驱动程序 | | **KILLER** | `--kill` / `--pid` | 任何用户 | 通过 IOCTL 终止进程 | | **CLEANUP** | `--cleanup` | 管理员 | 停止并删除驱动程序服务 | ## 演示 ### SCANNER 模式 — 系统信息 ![SCANNER 模式](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/fa1a91f357091926.png) ### SCANNER 模式 — 目标进程搜索 ![SCANNER 目标](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4d4dbe63b6091933.png) ### LOADER 模式 — 加载驱动程序 ![LOADER 模式](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/39a882be35091937.png) ### LOADER 模式 — 自定义路径和服务名称 ![LOADER 自定义](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/dfeae32635091940.png) ### KILLER 模式 — 按进程名称终止 ![按名称终止](https://raw.githubusercontent.com/devianntsec/CVE-2024-51324/main/docs/screenshots/05-kill-name.gif) ### KILLER 模式 — 按 PID 终止 ![按 PID 终止](https://raw.githubusercontent.com/devianntsec/CVE-2024-51324/main/docs/screenshots/06-kill-pid.gif) ### KILLER 模式 — 限制实例数 ![限制实例](https://raw.githubusercontent.com/devianntsec/CVE-2024-51324/main/docs/screenshots/07-kill-limit.gif) ### KILLER 模式 — Dry Run (模拟) ![Dry Run](https://raw.githubusercontent.com/devianntsec/CVE-2024-51324/main/docs/screenshots/08-dry-run.gif) ### CLEANUP 模式 — 卸载驱动程序 ![CLEANUP 模式](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/9ac49feccd092112.png) ## 技术概览 ### IOCTL 攻击面 — 三个原语 通过 Ghidra 11.0.3 对 `BdApiUtil64.sys` 的逆向工程识别出了比以往任何公开来源记录的都要广泛的攻击面: | IOCTL | Handler | 原语 | 先前文档 | |-------|---------|-----------|-------------------| | `0x800024B4` | `FUN_000152b0` | **进程终止** | 部分(机制不正确) | | `0x80002648` | `FUN_00013bb0` | **任意文件删除** | 无 | | `0x8000264C` | `FUN_00013850` | **占用中文件删除(SectionObjectPointer 绕过)** | 无 | ### 原语 1 — 进程终止 (`0x800024B4`) 调度链有三个层级: ``` IOCTL 0x800024B4 └─ FUN_00028630 (IRP_MJ_DEVICE_CONTROL dispatcher) └─ FUN_00015230 (wrapper: validates IOCTL code and buffer size = 4 bytes) └─ FUN_000152b0 (kill handler — vulnerability locus) ``` 重建的 handler (Ghidra): ``` if ((param_1 != 0) && (param_1 != 4)) { PsLookupProcessByProcessId(param_1, &local_res10); ObOpenObjectByPointer( local_res10, 0x200, // OBJ_KERNEL_HANDLE 0, // PassedAccessState: NULL 0x1fffff, // PROCESS_ALL_ACCESS 0, // ObjectType: NULL 0, // AccessMode: KernelMode ← bypasses SeAccessCheck local_res18 ); ZwTerminateProcess(local_res18[0], 0); } ``` **为什么 `KernelMode` 会绕过 `SeAccessCheck`:** ``` ZwOpenProcess path: NtOpenProcess → ObOpenObjectByName → SeAccessCheck (checks DACL, caller token, integrity level) can return STATUS_ACCESS_DENIED ObOpenObjectByPointer(KernelMode) path: SeAccessCheck ← NOT invoked → PROCESS_ALL_ACCESS handle granted unconditionally ``` `ZwOpenProcess` **不在该驱动程序的导入表中**。先前资料中出现的基于 `ZwOpenProcess` 的描述在技术上是错误的。 ### 原语 2 — 任意文件删除 (`0x80002648`) Handler `FUN_00013bb0` 接收一个 Unicode 路径,验证 `InputBufferLength ≥ 0x208`,并委托给 `FUN_00013c10`。子处理程序以内核模式打开文件(对调用者 token 不执行 `SeAccessCheck`),并派发一个 `IRP_MJ_SET_INFORMATION` IRP,其 `FileInformationClass = 0xD`(`FileDispositionInformation`),将该文件标记为删除。任何内核可访问的文件都可以被删除,而不管 NTFS 权限如何。 ### 原语 3 — 占用中文件删除 (`0x8000264C`) Handler `FUN_000139d0` 访问 `FileObject->SectionObjectPointer`(`FILE_OBJECT` 中的偏移量 `0x28`),并在派发删除 IRP 之前临时置空两个字段: ``` plVar1 = FileObject->SectionObjectPointer; plVar1[2] = 0; // DataSectionObject → NULL plVar1[0] = 0; // ImageSectionObject → NULL IofCallDriver(device, irp); KeWaitForSingleObject(...); // Restore after completion plVar1[2] = DataSectionObject_backup; plVar1[0] = ImageSectionObject_backup; ``` `IopDeleteFile` 在处理 `FileDispositionInformation` 之前会检查这些指针。通过将它们置空,处理程序使该文件看起来未被映射,从而绕过了占用保护。此原语可以从磁盘上删除正在运行的 EDR 代理二进制文件,而无需首先终止进程。 **完整的 EDR 清除链:** ``` 1. Terminate EDR process (IOCTL 0x800024B4) 2. Delete EDR binary on disk (IOCTL 0x8000264C) ← works even if memory-mapped 3. Prevent restart ← executable no longer exists on disk ``` ## 经验测试 ### PPL 抵抗力(每个进程类别 10 次尝试) | 进程 | PPL 激活 | 可终止 | 原因 | |---------|-----------|------------|-------| | `notepad.exe` | 否 | ✅ 10/10 | 无保护 | | `regedit.exe` | 否 | ✅ 10/10 | 无保护 | | `spoolsv.exe` | 否 | ✅ 9/10 | SCM 在 1 例中重启 | | `MsMpEng.exe` | 否(测试环境中无 PPL) | ✅ 8/10 | 轻微的时序差异 | | `lsass.exe` | 否(缺少 `RunAsPPL`) | ✅ 6/10 | 状态可变性 | | `csrss.exe` | **是**(无条件 PPL) | ❌ 0/10 | `STATUS_ACCESS_DENIED` | PPL (Protected Process Light) 是抵抗来自此驱动程序的、基于 `ObOpenObjectByPointer(KernelMode)` 终止操作的**唯一运行时缓解措施**。 ### 导入表分析 | 存在 | 缺失 | |---------|--------| | `PsLookupProcessByProcessId` | `ZwOpenProcess` | | `ObOpenObjectByPointer` | `SeAccessCheck` | | `ZwTerminateProcess` | `SePrivilegeCheck` | | | `PsGetCurrentProcess` | | | `IoGetRequestorProcess` | ## 后渗透场景 | 场景 | 目标 | 影响 | |----------|--------|--------| | EDR/AV 终止 | `MsMpEng.exe`、`SentinelAgent.exe` | 防御规避 | | EDR 二进制文件删除(占用中) | 磁盘上的 EDR 可执行文件 | 防止终止后重启 | | 审计日志破坏 | `EventLog` 服务 | 篡改取证 | | 受保护进程绕过 | `lsass.exe`(无 RunAsPPL) | 凭据访问促成因素 | | 勒索软件加密前准备 | 安全代理 | 完整的防御规避链 | ## 取证痕迹 ### `--cleanup` 之后持续存在的内容 | 痕迹 | 清理后状态 | |----------|-------------------| | SCM 中的服务 | 已移除 | | `driverquery` 中的驱动程序 | 已移除 | | 设备对象 | 不可访问 | | 注册表项 | 已移除 | | **Event ID 7045** | **持续存在 — 无法通过 `sc delete` 移除** | Event ID 7045 是在经过完整攻击周期并进行清理后**唯一存留的痕迹**。它包含服务名称、`ImagePath`(完整二进制路径)、服务类型和创建时间戳。 ### 清除日志是自我归罪的行为 执行 `wevtutil cl System` 来移除 Event ID 7045 会在安全通道中生成 **Event ID 1102**,记录了谁在何时清除了日志。这使得日志篡改变得可检测,即使原始痕迹已被销毁。 | 攻击者操作 | 产生的痕迹 | 通道 | 持续性 | |----------------|--------------------|---------|-------------| | `wevtutil cl System` | Event ID 7045 已删除 | System | — | | `wevtutil cl System` | **生成 Event ID 1102** | **Security** | 永久 | ## 检测规则 ### Sigma 规则 ``` title: BYOVD Attack via BdApiUtil64.sys (CVE-2024-51324) id: a3f7c2e1-8b4d-4f9a-b6e3-2d1c9f8a7b5e status: experimental logsource: product: windows service: system detection: selection_eventid: EventID: 7045 selection_driver: - ServiceName|contains: 'BdApi' - ImagePath|contains: 'BdApiUtil64.sys' condition: selection_eventid and selection_driver level: high tags: - attack.defense_evasion - attack.t1562.001 - attack.privilege_escalation - attack.t1068 ``` 完整的 Sigma 规则和 Sysmon 配置(通过 SHA-256 哈希的 Event ID 6 + 通过注册表项的 Event ID 13)可在 [`docs/detection/`](docs/detection/) 中。 ## 技术文档 | 文档 | 描述 | |----------|-------------| | [Root Cause Analysis](docs/analysis/01-root-cause.md) | `IRP_MJ_DEVICE_CONTROL` handler 中缺失访问控制 | | [Driver Analysis](docs/analysis/02-driver-analysis.md) | 完整的 Ghidra 逆向工程,三个 IOCTL 原语,PPL 测试,导入表分析 | | [CVE Timeline](docs/analysis/03-timeline.md) | 发现、披露和补丁时间线 | ## 学术背景 本研究是我在 **网络安全硕士学位** (UCAM — Campus Internacional de Ciberseguridad) 的 **硕士论文** 的一部分,分析了跨多个环境的 N-Day 漏洞。 此 CVE 代表了论文中的 **Windows 内核驱动程序 / BYOVD** 向量,展示了: - 通过完整的 IOCTL 枚举进行的内核驱动程序攻击面分析 - 对先前公开描述的技术纠正(缺少 `ZwOpenProcess`;实际机制是 `ObOpenObjectByPointer(KernelMode)`) - 发现了两个以前未公开文档记录的原语(文件删除 IOCTL) - 经验性的 PPL 抵抗力表征 - 通过完整的清理后周期进行取证痕迹分析 - CVSS 评分批判:记录了官方 NVD 评分与本地利用严重性之间的差距 **关键词:** `BYOVD` · `Kernel Driver` · `IOCTL` · `Ghidra` · `Process Termination` · `File Deletion` · `SectionObjectPointer` · `ObOpenObjectByPointer` · `Defense Evasion` · `CVE-2024-51324` ## 作者 **Annais Molina (devianntsec)** — 网络安全硕士研究生 [![GitHub](https://img.shields.io/badge/GitHub-@devianntsec-181717?style=flat-square&logo=github)](https://github.com/devianntsec) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Annais%20Molina-0077B5?style=flat-square&logo=linkedin)](https://linkedin.com/in/annais-molina-fuentes) [![Email](https://img.shields.io/badge/Email-me%40deviannt.com-D14836?style=flat-square&logo=gmail)](mailto:me@deviannt.com) ## 致谢 - [**NVD / NIST**](https://nvd.nist.gov/vuln/detail/CVE-2024-51324) — CVE 记录和评分 - [**loldrivers.io**](https://www.loldrivers.io) — 社区维护的易受攻击驱动程序索引 - [**BlackSnufkin**](https://github.com/BlackSnufkin/BYOVD/tree/main/BdApiUtil-Killer) — 原始 PoC 参考 - [**Cisco Talos**](https://blog.talosintelligence.com/byovd-loader-deadlock-ransomware/) — DeadLock 勒索软件 BYOVD 分析(2025 年 12 月) ## 许可证 MIT License — 详见 [LICENSE](LICENSE) ## 法律免责声明 本代码仓库**仅用于教育和安全研究目的**,为学术硕士论文的一部分。所有测试均在无网络暴露的隔离虚拟机上进行。易受攻击的驱动程序(`BdApiUtil64.sys`)未在本代码仓库中分发——必须独立获取。仅在您拥有或获得明确书面授权进行测试的系统上使用。对系统进行未经授权的使用是非法的,并可能导致刑事起诉。
© 2026 Annais Molina · 网络安全硕士论文
UCAM Universidad Católica San Antonio de Murcia · Campus Internacional de Ciberseguridad
标签:0day挖掘, BdApiUtil64.sys, BYOVD, CVE-2024-51324, IOCTL逆向, Python, Web报告查看器, Windows驱动, 云资产清单, 内核安全, 协议分析, 学术研究, 安全扫描, 安全描述符, 安全防御绕过, 恶意驱动加载, 情报收集, 数据展示, 无后门, 时序注入, 本地提权, 权限提升, 漏洞研究, 硕士学位论文, 红队, 网络安全, 逆向工具, 逆向工程, 隐私保护