Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-42978-PoC-Research — CVE-2026-42978 — Windows 推送通知服务(WpnService)中的释放后使用(Use-After-Free)竞态条件。包含补丁差异、根因分析、TOCTOU 实验以及 Sysmon/ETW 检测规则。 | Kitploit
工具/GitHubGitHub/grizzzer/cve-2026-42978-poc-research
漏洞分析漏洞利用取证分析二进制分析学习与教育事件响应实验室与实践
GitHubgrizzzer/cve-2026-42978-poc-research

CVE-2026-42978-PoC-Research

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

CVE-2026-42978 — Windows 推送通知服务(WpnService)中的释放后使用(Use-After-Free)竞态条件。包含补丁差异、根因分析、TOCTOU 实验以及 Sysmon/ETW 检测规则。

查看仓库
2871023个月前Kitploit 审核通过
分享

CVE-2026-42978 PoC 与研究 —— Windows 推送通知释放后使用(Use-After-Free)

Windows 推送通知服务(WpnService)中存在竞争条件,该服务以 NT AUTHORITY\SYSTEM 身份运行。拥有本地访问权限的攻击者可在平台关闭期间触发释放后使用,并可能提升权限。

  • CVE: CVE-2026-42978
  • BDU: BDU:2026-08249
  • 类型: CWE-362(竞争条件)、释放后使用(Use-After-Free)
  • CVSS: 7.8(高危)
  • 受影响: Windows 10、Windows 11、Windows Server 2016/2019/2022/2025
  • 已修复: 2026 年 6 月 10 日(补丁星期二)
  • 状态: 已修复。本仓库仅用于防御性研究。

工作原理

WpnService 是 Windows 推送通知服务。它以 LocalSystem 身份、在会话 0 中运行于 svchost.exe -k netsvcs -p 进程内。所有通知投递——toast、磁贴、徽章——都经由它完成。

漏洞位于 wpncore.dll 中,具体在 PresentationEndpointFacade 类里。该类封装了所有通知 API 调用(toast 投递、会话管理、设置查询等),并委托给 PresentationEndpointImpl。

这个 Bug 在于:在平台关闭过程中,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(...);
}

存在漏洞的 ToastUnblockAll 的 Ghidra 反汇编
Ghidra:存在漏洞的 ToastUnblockAll —— 访问平台前无任何同步

已修补的代码(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 内部库)进行分阶段部署。它让微软可以逐步启用修复,并在出现问题时将其禁用。

修复的规模

这不是单个函数的 Bug。相同的锁+防护模式被添加到了 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 身份执行代码

实际的利用过程——堆喷、虚表劫持、实现代码执行——不在本次研究范围内。本仓库专注于理解根本原因和构建检测能力。

TOCTOU 竞争条件实验

lab/ 目录包含一个独立的 C 语言演示程序,它复现了此类 Bug,且不会触及 WpnService。它采用与 WpnService 类似的命名管道 + 共享内存架构。

工作原理:

  • vulnerable_service.exe 从共享内存读取消息长度,验证后休眠 50 毫秒,然后再次读取该长度(双重取用,double-fetch)。
  • race_attacker.exe 先设置一个安全长度并触发服务,然后立即将共享内存翻转为溢出值。
  • 若时机把握得当,服务会在第二次取用时读到溢出值——缓冲区溢出。

运行 vulnerable_service.exe --patched 即可看到修复效果:单次取用并保存到局部变量。

TOCTOU 竞争条件演示
左侧:服务检测到竞争(5/5)。右侧:攻击者翻转共享内存中的值。

构建并运行

需要 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 监视器输出
ETW 监视器:WpnService 正在运行(PID 6432),无崩溃,每小时 100 个事件,系统已修补

Sysmon 规则(detection/sysmon_wpn_race_detect.xml)

用于持续监控的六组规则:

规则捕获内容
WPN_EoP_ChildProcesssvchost(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/分钟)——可能是竞争喷洒(race spray)
  • 错误/严重事件——可能是利用失败导致的崩溃

事件查看器中的 WPN 事件
事件查看器:PushNotifications-Platform 操作日志,事件 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权限提升竞争条件
CVE-2026-42978权限提升竞争条件
CVE-2026-42979权限提升竞争条件
CVE-2026-42991权限提升竞争条件
CVE-2026-42969信息泄露竞争条件
CVE-2026-42970信息泄露竞争条件
CVE-2026-42973信息泄露竞争条件
CVE-2026-26167权限提升—
CVE-2026-32160权限提升—

项目结构

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 实验在独立的模拟服务上演示了此类 Bug——它不会与 WpnService 或任何系统组件交互。

请确保你的 Windows 保持最新。若 etw_wpn_monitor.ps1 报告你的系统未修补——请立即安装 2026 年 6 月累积更新。

贡献

如果你有想补充的内容——更好的检测规则、sploit PoC、Ghidra 版本跟踪(Version Tracking)会话、YARA 签名,或对该集群中相关 CVE 的分析——欢迎提交 PR。

下载工具