grizzzer/CVE-2026-42978-PoC-Research

GitHub: grizzzer/CVE-2026-42978-PoC-Research

该项目深度分析了 CVE-2026-42978 Windows 推送通知服务释放后重用竞态条件漏洞的根因与补丁,并提供配套的 TOCTOU 教学实验与防御检测规则。

Stars: 0 | Forks: 0

# CVE-2026-42978 PoC 与研究 — Windows 推送通知释放后重用 在以 `NT AUTHORITY\SYSTEM` 身份运行的 Windows 推送通知服务(`WpnService`)中存在的竞态条件。具有本地访问权限的攻击者可以在平台关闭期间触发释放后重用,从而可能导致权限提升。 - **CVE:** [CVE-2026-42978](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-42978) - **BDU:** [BDU:2026-08249](https://pm.gov.ru/vul/2026-08249) - **类型:** CWE-362 (竞态条件),释放后重用 - **CVSS:** 7.8 (高危) - **受影响版本:** Windows 10, Windows 11, Windows Server 2016/2019/2022/2025 - **已修复:** 2026 年 6 月 10 日 (补丁星期二) - **状态:** 已修复。此仓库仅用于防御性研究。 ## 工作原理 `WpnService` 是 Windows 推送通知服务。它在会话 0 中作为 LocalSystem 运行在 `svchost.exe -k netsvcs -p` 内部。所有通知传递 — toast、磁贴、角标 — 都通过它进行处理。 该漏洞存在于 `wpncore.dll` 中,特别是 `PresentationEndpointFacade` 类中。该类封装了所有通知 API 调用(toast 传递、会话管理、设置查询等)并委托给 `PresentationEndpointImpl`。 漏洞原因:在平台关闭期间,`NotificationPlatform` 对象会被销毁。但是 Facade 方法没有检查是否正在进行关闭 — 它们获取了指向该平台的指针,而该平台随后被关闭线程释放,导致 Facade 使用了悬垂指针。这是典型的释放后重用竞态问题。 ### 漏洞代码(反编译自 wpncore.dll build 26100.8521) ``` // PresentationEndpointFacade::ToastUnblockAll — VULNERABLE long ToastUnblockAll(PresentationEndpointFacade *this) { // No lock. No shutdown check. Just grab the platform pointer and go. NotificationPlatformHandle::Get(this + 0x50); if (platform == NULL) Throw_Hr(...); // If shutdown frees the platform right here — use-after-free return PresentationEndpointImpl::UnblockToastsForEachApp(...); } ```

Ghidra disassembly of vulnerable ToastUnblockAll
Ghidra: vulnerable ToastUnblockAll — no synchronization before accessing the platform

### 已修复代码(wpncore.dll build 26100.8655) ``` // PresentationEndpointFacade::ToastUnblockAll — PATCHED long ToastUnblockAll(PresentationEndpointFacade *this) { if (Feature_4097557817::IsEnabled()) { AcquireSRWLockShared(&Wns::s_platformLock); // 1. shared lock if (Wns::s_platformShutdown) // 2. shutdown guard Throw_Hr(E_APPLICATION_EXITING); NotificationPlatformHandle::Get(this + 0x50); // ... do work ... ReleaseSRWLockShared(&Wns::s_platformLock); // 3. RAII release } else { // feature flag off — old behavior preserved for rollback } } ``` 该修复增加了三处内容: 1. **`AcquireSRWLockShared`** — 共享读写锁。多个 API 调用可以并发运行,但关闭操作会获取独占锁并阻塞所有调用。 2. **`s_platformShutdown` 检查** — 如果关闭已经开始,则立即退出并返回 `E_APPLICATION_EXITING`。 3. **RAII 锁释放** — 锁保存在 `wil::unique_storage` 包装器中,因此即使抛出异常它也会被释放。 特性开关 `Feature_4097557817` 用于通过 WIL (Windows Internal Library) 进行分阶段推出。它允许 Microsoft 逐步启用该修复,并在出现问题时将其禁用。 ### 修复规模 这并不是一个单函数的漏洞。在 `wpncore.dll` 的 **49 个函数**中添加了相同的锁+保护模式: | 类别 | 函数 | |----------|-----------| | Toast 操作 | `ToastUnblockAll`, `ToastCreateSession`, `ToastCloseSession`, `ToastRequestAllNotifications`, `ToastSuppress` | | 磁贴操作 | `TileCreateSession`, `TileCloseSession`, `TileRequestResourceForeground` | | 注册 | `RegisterApplication`, `UnregisterApplication`, `RegisterHandler`, `UpdateRegistration`, `RegisterSystemApplication` | | 设置 | `ChangeAppSetting`, `QueryAppSetting`, `QueryGlobalSetting`, `RegisterSettingCallback`, `UnregisterSettingCallback` | | 传递 | `Deliver`, `GetPayloadForNotificationId`, `Submit`, `PostScheduledNotification` | | 查询 | `GetRegisteredHandler`, `GetRegisteredHandlersFromParent`, `GetSettingsFromHandler`, `GetAssetsFromHandler` | 每个涉及该平台的 `PresentationEndpointFacade::*` 方法都进行了相同的修复。底层的 `PresentationEndpointImpl::*` 方法保持不变 — 问题仅存在于 Facade 层。 ## 影响 WpnService 以 SYSTEM 权限运行。如果竞态成功: 1. 被释放的 `NotificationPlatform` 对象的内存可以被回收,并填充攻击者控制的数据(堆喷射) 2. 随后对悬垂指针进行的虚方法调用将跳转到攻击者控制的地址 3. 以 `NT AUTHORITY\SYSTEM` 身份执行代码 实际的漏洞利用 — 堆喷射、vtable 劫持、实现代码执行 — 超出了本研究的范围。此仓库专注于**理解根本原因**和**构建检测机制**。 ## TOCTOU 竞态条件实验 `lab/` 目录包含一个独立的 C 演示程序,它在不涉及 WpnService 的情况下重现了此类漏洞。它使用了类似于 WpnService 的命名管道 + 共享内存架构。 **工作原理:** - `vulnerable_service.exe` 从共享内存中读取消息长度,对其进行验证,休眠 50 毫秒,然后**再次**读取该长度(二次获取)。 - `race_attacker.exe` 设置一个安全的长度,触发服务,然后立即将共享内存翻转为一个会导致溢出的值。 - 如果时机合适,服务会在第二次获取时读取到溢出值 — 导致缓冲区溢出。 运行 `vulnerable_service.exe --patched` 以查看修复方案:将单次获取的内容捕获到局部变量中。

TOCTOU race condition demo
Left: service detects race (5/5). Right: attacker flipping shared memory values.

### 构建并运行 需要 GCC (MinGW)。在 `lab/` 目录下运行: ``` build.bat ``` 终端 1: ``` vulnerable_service.exe ``` 终端 2: ``` race_attacker.exe 5 ``` 然后与 `vulnerable_service.exe --patched` 进行比较 — 相同的攻击,但检测到的竞态次数为零。 ## 检测 ### ETW 监视器 (`detection/etw_wpn_monitor.ps1`) 检查 7 项指标的 PowerShell 脚本: 1. WpnService 状态和 PID 2. 崩溃/重启历史(利用失败会留下崩溃痕迹) 3. 推送通知平台事件日志突发检测 4. 与 WPN 相关的命名管道 5. 补丁验证(检查 wpncore.dll 日期) 6. 加载了 WPN 模块的进程 7. 通知数据路径中的软链接/联接审计 ``` powershell -ExecutionPolicy Bypass .\detection\etw_wpn_monitor.ps1 ```

ETW monitor output
ETW monitor: WpnService running (PID 6432), no crashes, 100 events/hour, system patched

### Sysmon 规则 (`detection/sysmon_wpn_race_detect.xml`) 用于持续监控的六个规则组: | 规则 | 捕获内容 | |------|----------------| | `WPN_EoP_ChildProcess` | svchost (netsvcs) 启动 cmd/powershell/wscript | | `WPN_PipeAccess` | 连接到与 WPN 相关的命名管道 | | `WPN_FileCreation` | 在通知数据目录中创建文件 | | `WPN_RegistryTampering` | 写入 PushNotifications 键的注册表操作 | | `WPN_ProcessAccess` | 指向 svchost 的 `PROCESS_ALL_ACCESS` 句柄 | | `WPN_ThreadInjection` | 对 svchost 执行 `CreateRemoteThread` 操作 | 安装: ``` sysmon64.exe -accepteula -i detection\sysmon_wpn_race_detect.xml ``` ### 事件查看器 WpnService 活动记录在 `Microsoft-Windows-PushNotifications-Platform/Operational` 中。需要关注的关键事件: - 事件 1225:传输层 WPN 命令 - 突发事件快速激增(>20次/分钟)— 可能是竞态堆喷射 - 错误/严重事件 — 可能是利用失败导致的崩溃

Event Viewer WPN event
Event Viewer: PushNotifications-Platform operational log, Event ID 1225

## 补丁对比 对比 `wpncore.dll` 的主要发现: - `.text` 节增加了 **18,432 字节**(跨越 49 个函数的新的锁/保护代码) - `.data` 节增加了 **96 字节**(新的 `Wns::s_platformLock` 和 `Wns::s_platformShutdown` 全局变量) - 未添加新的导入 — `AcquireSRWLockShared`/`ReleaseSRWLockShared` 已经存在于导入表中 - 新的 RAII 析构函数:`~unique_any_t<...ReleaseSRWLockExclusive...>` 证实了添加了锁包装器 完整报告位于 `reports/` 中。 ## 相关 CVE CVE-2026-42978 是 2026 年 6 月修复的 9 个与 WPN 相关的漏洞集群的一部分: | CVE | 类型 | CWE | |-----|------|-----| | CVE-2026-42977 | EoP | 竞态条件 | | **CVE-2026-42978** | **EoP** | **竞态条件** | | CVE-2026-42979 | EoP | 竞态条件 | | CVE-2026-42991 | EoP | 竞态条件 | | CVE-2026-42969 | 信息泄露 | 竞态条件 | | CVE-2026-42970 | 信息泄露 | 竞态条件 | | CVE-2026-42973 | 信息泄露 | 竞态条件 | | CVE-2026-26167 | EoP | — | | CVE-2026-32160 | EoP | — | ## 项目结构 ``` CVE-2026-42978/ ├── README.md ├── lab/ │ ├── vulnerable_service.c # mock WpnService with double-fetch bug │ ├── race_attacker.c # attacker that exploits the double-fetch │ └── build.bat # GCC build script ├── detection/ │ ├── etw_wpn_monitor.ps1 # 7-check PowerShell detector │ └── sysmon_wpn_race_detect.xml # Sysmon rule config ├── reports/ │ ├── PE_DIFF_REPORT.txt # PE section/import diff results │ └── FUNCTION_DIFF_REPORT.txt # function-level diff (49 changed) └── img/ # screenshots for this README ``` ## 环境要求 - Windows 10/11(用于运行实验和检测工具) - GCC / MinGW(用于构建 C 语言实验环境) - Python 3.9+(用于对比脚本) - Ghidra 11+(用于无头反编译,可选) - Sysmon(用于检测规则,可选) ## 免责声明 本项目仅用于**防御性安全研究**。该漏洞已被修复。不包含任何武器化的漏洞利用代码。TOCTOU 实验环境在独立的模拟服务上演示了此类漏洞 — 它不会与 WpnService 或任何系统组件进行交互。 请确保您的 Windows 已更新至最新版本。如果 `etw_wpn_monitor.ps1` 报告您的系统未打补丁 — 请立即安装 2026 年 6 月的累积更新。 ## 许可证 MIT
标签:AI合规, AMSI绕过, UAF, Web报告查看器, 云资产清单, 威胁检测, 客户端加密, 本地提权, 漏洞分析, 路径探测, 逆向工具, 逆向工程