devianntsec/CVE-2024-30051
GitHub: devianntsec/CVE-2024-30051
针对 Windows DWM 堆溢出漏洞(CVE-2024-30051)的硕士论文研究项目,包含完整的漏洞利用链、50 次会话的统计验证以及从根本因分析到提权成功的全流程学术文档。
Stars: 0 | Forks: 0
# CVE-2024-30051 — Windows DWM 堆溢出提权 · 硕士论文研究
[](https://msrc.microsoft.com/update-guide/en-US/advisory/CVE-2024-30051)
[](https://github.com/devianntsec)
[](LICENSE)
[](https://github.com/devianntsec)
[-orange)](https://nvd.nist.gov/vuln/detail/CVE-2024-30051)
## 描述
本代码库包含我关于 **CVE-2024-30051** 的**硕士论文研究**,这是
Windows 桌面窗口管理器核心库(`dwmcore.dll`)中的一个高危(CVSS 7.8)**提权**漏洞。
该漏洞源于 `CCommandBuffer::Initialize` 中的**整数除法大小计算错误**。
由于此计算错误,用于 `new()` 的大小与用于 `memcpy()` 的大小出现差异,
从而产生了 **0x8F 字节的堆溢出**。成功的漏洞利用会导致 `dwm.exe` 加载攻击者控制的 DLL,
并在具有 **SYSTEM 完整性级别** 的 `window manager\dwm-1` 账户下执行任意代码。
### 我的贡献
| 方面 | 描述 |
|--------|-------------|
| **补丁对比** | 完整的 BinDiff 分析,确认 `CCommandBuffer::Initialize` 为确切的漏洞位置(相似度得分 0.32,而 14,062 个匹配函数的全局得分为 0.98) |
| **WinDbg 动态分析** | 逐步验证所有 4 个 hook、大小字段覆写以及载荷构造 |
| **经验性堆喷射分析** | 在两种 RAM 配置(8,192 MB 和 4,096 MB)下进行的 **50 次受控会话**及正式统计测试 |
| **统计结果** | Mann-Whitney U 检验 (p = 0.031) 和 Welch's t 检验 (p = 0.011) 证实了 RAM 的影响;观察到的均值比理论预测的约 64 次尝试好 12.9–19 倍 |
| **载荷 DLL 路径集中化** | 提取硬编码路径至 `#define PAYLOAD_DLL_PATH` 预处理常量 |
| **会话记录** | 每次会话带有完整时间戳的日志写入 `%TEMP%\cve_30051_log.txt` |
| **学术文档** | 根本原因、50 次会话的堆喷射分析及 CVE 时间线 |
## 代码库结构
```
CVE-2024-30051-Masters-Thesis/
├── README.md
├── LICENSE
├── setup.bat # Copies s11.dll to required location
│
├── exploit/
│ ├── C21.sln # Visual Studio 2022 solution
│ ├── exploit_src/
│ │ ├── c26f.vcxproj
│ │ ├── c26f.filters
│ │ └── main.cpp # Exploit — heap spray + hooking + overflow
│ └── payload/
│ ├── payload.vcxproj
│ ├── payload.vcxproj.filters
│ ├── dllmain.cpp # Payload DLL — spawns SYSTEM shell + cleanup
│ ├── framework.h
│ ├── pch.h
│ └── pch.cpp
│
└── docs/
├── screenshots/ # Patch diffing, WinDbg, and forensic captures
└── analysis/
├── 01-root-cause.md # Integer division bug in CCommandBuffer::Initialize
├── 02-heap-spray.md # 50-session empirical data and statistical findings
└── 03-timeline.md # Discovery, disclosure, and patch chronology
```
## 快速开始
### 前置条件
- Windows 11 22H2(内部版本 22621.3447,**未修补** — 未安装 KB5037771)
- 安装了 C++ 桌面开发工作负载的 Visual Studio 2022
- 建议使用带有快照的 VM(这是实现可重现堆状态所必需的)
### 步骤 1 — 构建载荷 DLL
在 Visual Studio 2022 中打开 `C21.sln`。以 **Release x64** 配置构建 `payload` 项目。
### 步骤 2 — 放置 DLL
从代码库根目录运行 `setup.bat`。它会将 `s11.dll` 复制到
`C:\Users\Public\Documents\s11.dll`(即由 `PAYLOAD_DLL_PATH` 定义的路径)。
### 步骤 3 — 构建漏洞利用程序
以 **Release x64** 配置构建 `C26f` 项目。
### 步骤 4 — 运行
```
x64\Release\C26f.exe
```
在标准(非提升权限的)CMD 中运行。该漏洞利用程序会自动重试最多 10 次。
成功后,`dwm.exe` 会加载 `s11.dll` 并生成一个具有 **SYSTEM 完整性级别** 的 CMD。
会话日志将写入 `%TEMP%\cve_30051_log.txt`。
## 漏洞利用配置
```
#define MAX_ATTEMPTS 10 // Max auto-retry attempts per session
#define SPRAY_STEP 0x10 // Hole spacing index (1024 holes)
#define SPRAY_RANGE_START 0x3000 // Spray range start index
#define SPRAY_RANGE_END 0x7000 // Spray range end index
#define SLEEP_POST_SPRAY 0xC8 // ms wait after spray (200ms)
#define SLEEP_POST_HOLES 0xC8 // ms wait after freeing holes (200ms)
#define PAYLOAD_DLL_PATH "C:\\Users\\Public\\Documents\\s11.dll"
```
## 技术概述
### 漏洞根本原因
在 `CCommandBuffer::Initialize`(`dwmcore.dll` 10.0.22621.3447)中,
`CD2DSharedBuffer::GetBufferSize` 被调用了两次。传递给 `new()` 的大小在
相乘之前经历了除以 `0x90` 的整数除法,而 `memcpy()` 则使用原始值:
```
buffer_size = GetBufferSize() → e.g. 0x23F
size_new = (0x23F / 0x90) * 0x90 = 0x1B0 ← allocated
size_memcpy = 0x23F ← copied
overflow = 0x23F - 0x1B0 = 0x8F bytes
```
### 补丁对比结果
内部版本 10.0.22621.3447(易受攻击)与 10.0.22621.3593(已修补)之间的 BinDiff 对比:
| 指标 | 值 |
|--------|-------|
| 全局相似度 | 0.98 |
| 置信度 | 0.99 |
| 匹配的函数 | 14,062 (99.1%) |
| `CCommandBuffer::Initialize` 相似度 | **0.32** |
| 基本块 — 易受攻击版本 | 4 |
| 基本块 — 已修补版本 | 20(新增了 16 个验证块) |
在全局相似度为 0.98 的情况下出现 0.32 这一异常得分,正是
漏洞位置的直接特征。
### 漏洞利用链
```
1. Hook RtlCreateHeap → capture dwmcore heap handle
2. Hook RtlAllocateHeap → capture base chunk address
3. Hook NtDCompositionCreateChannel → capture MappedAddress (shared memory region)
4. Hook NtDCompositionCommitChannel → overwrite size field (0x120 → 0x23F)
inject additional batch commands
5. Heap spray 0x10000 CHolographicInteropTexture objects (size=0x1B0)
6. Free holes every 0x10 indices → create gaps for overflow landing
7. Write payload into overflow buffer → KCBTable+0x388 + LoadLibraryA + DLL path
8. Release all spray objects → trigger overflow → LoadLibraryA("s11.dll")
9. dwm.exe loads payload DLL → spawns CMD as SYSTEM integrity
```
## 经验性堆喷射分析(50 次会话)
### 研究问题
可用 RAM 是否会影响成功进行堆喷射所需的尝试次数?
### 实验设计
两个包含 25 次会话的实验组。每次会话的协议:恢复干净的启动后快照 →
等待 100 秒稳定 → 启动漏洞利用程序 → 记录成功的尝试次数。
| 分组 | RAM | 会话数 | 成功 | 失败 |
|-------|-----|----------|-----------|---------|
| A | 8,192 MB | 25 | 24 | 1 |
| B | 4,096 MB | 25 | 24 | 1 |
### 结果
| 分组 | RAM | 平均尝试次数 | 标准差 | 95% CI | 相比理论值 (64) 的倍数 |
|-------|-----|--------------|---------------|--------|-----------------------|
| A | 8,192 MB | **3.375** | 1.135 | [2.896; 3.854] | **约快 19 倍** |
| B | 4,096 MB | **4.958** | 2.645 | [3.841; 6.076] | **约快 12.9 倍** |
### 统计检验
| 检验方法 | 统计量 | p 值 | 结论 |
|------|-----------|---------|------------|
| Mann-Whitney U | U = 184.0 | **p = 0.031** | 拒绝 H₀ |
| Welch's t 检验 | t(23) = −2.695 | **p = 0.011** | 拒绝 H₀ |
### 主要结论
- **C1:** 启动后的 DWM 堆比理论预测**具有 12.9–19 倍的确定性**。
- **C2:** RAM 可用性对堆喷射的可靠性有统计学上的显著影响 (p = 0.031)。
- **C3:** RAM 减半会使标准差翻倍 (1.135 → 2.645)。
- **C4:** 在两种配置中,失败率均匀保持在 4%。
- **C5:** 常量 `base = heap_base + 0x720` 证实了可重现的启动后堆布局
是确定性的主要驱动因素,而非空洞密度。
- **C6:** 当 RAM ≥ 8 GB 时,攻击者有望在前 5 次尝试内取得成功。
完整的原始数据、会话日志格式以及确定性堆观察结果记录在
[`docs/analysis/02-heap-spray.md`](docs/analysis/02-heap-spray.md) 中。
## 漏洞利用后的输出
成功后,将在 `window manager\dwm-1` 下打开一个 CMD 窗口:
```
=====================================================
CVE-2024-30051 - Windows DWM Heap Overflow EoP
CWE-122 | CVSS 7.8 | Elevation of Privilege
=====================================================
Researched and reproduced by : devianntsec
Original PoC by : Ricardo Narvaja (Fortra)
Target : Windows 11 22H2 (22621.3447)
=====================================================
[*] Current user:
window manager\dwm-1
[*] Mandatory Integrity Level:
Mandatory Label\System Mandatory Level S-1-16-16384
[*] Enabled privileges:
SeImpersonatePrivilege Enabled
=====================================================
Shell running under DWM process - SYSTEM level
=====================================================
```
痕迹(`s11.dll` 和 `.bat` 脚本)将在 5 秒后
通过延迟清理过程自动删除。
## 取证痕迹
| 痕迹 | 位置 | 持久性 | 检测工具 |
|----------|----------|-------------|----------------|
| `dwm.exe` 的子进程 `cmd.exe` | 安全事件日志 | 是(如果启用了进程审核) | **Event ID 4688** |
| 访问 `dwm.exe` 的外部进程 | Sysmon | 是 | **Sysmon Event ID 10** |
| 失败尝试导致的 `dwm.exe` 崩溃 | 应用程序事件日志 | 是 | **Event ID 1000** |
| 磁盘上的载荷 DLL `s11.dll` | `C:\Users\Public\Documents\` | 仅前约 5 秒 | SHA-256 监控 |
## 技术文档
| 文档 | 描述 |
|----------|-------------|
| [根本原因分析](docs/analysis/01-root-cause.md) | `CCommandBuffer::Initialize` 中的整数除法错误,补丁对比方法学 |
| [堆喷射分析](docs/analysis/02-heap-spray.md) | 50 次会话的经验数据、原始会话数据、统计测试 |
| [CVE 时间线](docs/analysis/03-timeline.md) | 发现、披露和补丁时间表 |
## 学术背景
本研究是我**网络安全硕士学位**
(UCAM — Campus Internacional de Ciberseguridad)论文的一部分,旨在分析
跨多个环境的 N-Day 漏洞。
该 CVE 代表了论文中的 **Windows 桌面应用程序** 攻击面,
并展示了:
- 通过 DirectComposition ALPC 通道利用基于堆的缓冲区溢出
- 二进制对比(BinDiff)作为系统性定位 N-Day 漏洞的方法
- 无需外部工具的进程内 API hooking
- 跨 RAM 配置的堆喷射确定性的经验量化
**关键词:** `EoP` · `堆溢出` · `DirectComposition` · `DWM` · `补丁对比` ·
`BinDiff` · `WinDbg` · `堆喷射` · `经验分析` · `CVE-2024-30051`
## 作者
**Annais Molina (devianntsec)** — 网络安全硕士研究生
[](https://github.com/devianntsec)
[](https://linkedin.com/in/annais-molina-fuentes)
[](mailto:me@deviannt.com)
## 致谢
- [**Ricardo Narvaja (Fortra/CoreSecurity)**](https://github.com/fortra/CVE-2024-30051) — 原始 PoC 及逆向工程分析
- [**Kaspersky GReAT**](https://securelist.com/cve-2024-30051/112954/) — 原始漏洞发现及负责任的披露
- [**Microsoft MSRC**](https://msrc.microsoft.com/update-guide/en-US/advisory/CVE-2024-30051) — 补丁 KB5037771(2024 年 5 月)
## 许可证
MIT 许可证 — 详见 [LICENSE](LICENSE)
## 法律免责声明
本代码库**仅供教育和安全研究之用**,
为学术硕士论文的一部分。所有测试均在无网络暴露的独立虚拟
机上进行。请仅在您拥有或已获得明确书面
授权进行测试的系统上使用。对系统进行未经授权的使用是非法的,并可能导致
刑事起诉。
© 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
标签:BinDiff, C++, Conpot, CVE-2024-30051, CVSS 7.8, DWM, dwmcore.dll, OpenCanary, Web报告查看器, WinDbg, Windows安全, 二进制漏洞利用, 内存布局操纵, 堆喷射, 堆溢出, 安全学术研究, 情报收集, 数据展示, 数据擦除, 整数溢出, 本地提权, 桌面窗口管理器, 漏洞研究, 硕士学位论文, 系统提权, 红队, 网络安全, 补丁对比, 隐私保护