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://img.shields.io/badge/Platform-Windows%2011%2022H2-blue)](https://msrc.microsoft.com/update-guide/en-US/advisory/CVE-2024-30051) [![语言](https://img.shields.io/badge/Language-C%2B%2B-informational)](https://github.com/devianntsec) [![许可证:MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![研究](https://img.shields.io/badge/Research-Master's%20Thesis-purple)](https://github.com/devianntsec) [![CVSS](https://img.shields.io/badge/CVSS-7.8%20(High)-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)** — 网络安全硕士研究生 [![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) [![电子邮件](https://img.shields.io/badge/Email-me%40deviannt.com-D14836?style=flat-square&logo=gmail)](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
标签:BinDiff, C++, Conpot, CVE-2024-30051, CVSS 7.8, DWM, dwmcore.dll, OpenCanary, Web报告查看器, WinDbg, Windows安全, 二进制漏洞利用, 内存布局操纵, 堆喷射, 堆溢出, 安全学术研究, 情报收集, 数据展示, 数据擦除, 整数溢出, 本地提权, 桌面窗口管理器, 漏洞研究, 硕士学位论文, 系统提权, 红队, 网络安全, 补丁对比, 隐私保护