## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-GRIZZZER-CVE-2026-42978-POC-RESEARCH
# CVE-2026-42978 PoC & Pesquisa — Uso Após Liberação no Windows Push Notifications
Condição de corrida no serviço Windows Push Notifications (`WpnService`), que é executado como `NT AUTHORITY\SYSTEM`. Um atacante com acesso local pode acionar um uso após liberação durante o desligamento da plataforma e potencialmente elevar privilégios.
* **CVE:** CVE-2026-42978
* **BDU:** BDU:2026-08249
* **Tipo:** CWE-362 (Condição de Corrida), Uso Após Liberação
* **CVSS:** 7.8 (Alta)
* **Afetados:** Windows 10, Windows 11, Windows Server 2016/2019/2022/2025
* **Corrigido:** 10 de junho de 2026 (Patch Tuesday)
* **Status:** Corrigido. Este repositório é apenas para pesquisa defensiva.
## Como Funciona
`WpnService` é o serviço Windows Push Notification. Ele é executado na sessão 0 como LocalSystem dentro de `svchost.exe -k netsvcs -p`. Toda a entrega de notificações — toasts, tiles, badges — passa por ele.
A vulnerabilidade está em `wpncore.dll`, especificamente na classe `PresentationEndpointFacade`. Essa classe encapsula todas as chamadas da API de notificações (entrega de toasts, gerenciamento de sessão, consultas de configurações etc.) e delega para `PresentationEndpointImpl`.
O bug: durante o desligamento da plataforma, o objeto `NotificationPlatform` é destruÃdo. Mas os métodos da Facade não verificam se o desligamento está em andamento — eles obtêm um ponteiro para a plataforma, a plataforma é liberada pela thread de desligamento e a Facade usa um ponteiro pendente. Uma clássica condição de corrida de uso após liberação.
### Código vulnerável (decompilado do wpncore.dll build 26100.8521)
root@kitploit:~
// 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: ToastUnblockAll vulnerável — nenhuma sincronização antes de acessar a plataforma_
### Código corrigido (wpncore.dll build 26100.8655)
root@kitploit:~
// 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
}
}
A correção adiciona três coisas:
1. **`AcquireSRWLockShared`** — bloqueio compartilhado de leitores-gravadores. Várias chamadas de API podem ser executadas simultaneamente, mas o desligamento adquire um bloqueio exclusivo e bloqueia todas elas.
2. **Verificação de`s_platformShutdown`** — se o desligamento já começou, saia imediatamente com `E_APPLICATION_EXITING`.
3. **Liberação do bloqueio via RAII** — o bloqueio é mantido em um wrapper `wil::unique_storage`, portanto é liberado mesmo se uma exceção for lançada.
O feature flag `Feature_4097557817` serve para implantação em fases via WIL (Windows Internal Library). Ele permite que a Microsoft habilite a correção gradualmente e a desative se algo quebrar.
### Escala da correção
Este não é um bug de uma única função. O mesmo padrão de bloqueio+proteção foi adicionado a **49 funções** em `wpncore.dll`:
Categoria| Funções
---|---
Operações de Toast| `ToastUnblockAll`, `ToastCreateSession`, `ToastCloseSession`, `ToastRequestAllNotifications`, `ToastSuppress`
Operações de Tile| `TileCreateSession`, `TileCloseSession`, `TileRequestResourceForeground`
Registro| `RegisterApplication`, `UnregisterApplication`, `RegisterHandler`, `UpdateRegistration`, `RegisterSystemApplication`
Configurações| `ChangeAppSetting`, `QueryAppSetting`, `QueryGlobalSetting`, `RegisterSettingCallback`, `UnregisterSettingCallback`
Entrega| `Deliver`, `GetPayloadForNotificationId`, `Submit`, `PostScheduledNotification`
Consultas| `GetRegisteredHandler`, `GetRegisteredHandlersFromParent`, `GetSettingsFromHandler`, `GetAssetsFromHandler`
Todos os métodos `PresentationEndpointFacade::*` que tocam a plataforma receberam a mesma correção. Os métodos `PresentationEndpointImpl::*` subjacentes não foram alterados — o problema estava apenas na camada de facade.
## Impacto
O WpnService é executado como SYSTEM. Se a corrida for vencida:
1. A memória do objeto `NotificationPlatform` liberado pode ser recuperada e preenchida com dados controlados pelo atacante (heap spray)
2. Uma chamada subsequente a um método virtual no ponteiro pendente salta para um endereço controlado pelo atacante
3. Execução de código como `NT AUTHORITY\SYSTEM`
A exploração real — heap spray, sequestro de vtable, obtenção de execução de código — está fora do escopo desta pesquisa. Este repositório foca em **entender a causa raiz** e **construir detecção**.
## Laboratório de Condição de Corrida TOCTOU
O diretório `lab/` contém uma demonstração C independente que reproduz a classe de bug sem tocar no WpnService. Ela usa uma arquitetura de pipe nomeado + memória compartilhada semelhante à do WpnService.
**Como funciona:**
* `vulnerable_service.exe` lê um comprimento de mensagem da memória compartilhada, valida, dorme por 50ms e então lê o comprimento **novamente** (double-fetch).
* `race_attacker.exe` define um comprimento seguro, aciona o serviço e imediatamente altera a memória compartilhada para um valor de estouro.
* Se o timing estiver certo, o serviço lê o valor de estouro na segunda leitura — estouro de buffer.
Execute `vulnerable_service.exe --patched` para ver a correção: captura de leitura única em uma variável local.

_Esquerda: serviço detecta corrida (5/5). Direita: atacante alterando valores da memória compartilhada._
### Compilar e executar
Requer GCC (MinGW). A partir do diretório `lab/`:
root@kitploit:~
build.bat
Terminal 1:
root@kitploit:~
vulnerable_service.exe
Terminal 2:
root@kitploit:~
race_attacker.exe 5
Depois compare com `vulnerable_service.exe --patched` — mesmo ataque, zero corridas detectadas.
## Detecção
### Monitor ETW (`detection/etw_wpn_monitor.ps1`)
Script PowerShell que verifica 7 indicadores:
1. Estado e PID do WpnService
2. Histórico de falhas/reinicializações (exploração malsucedida deixa rastros de falha)
3. Detecção de rajadas no log de eventos do Push Notifications Platform
4. Pipes nomeados relacionados a WPN
5. Verificação de patch (verifica a data do wpncore.dll)
6. Processos com módulos WPN carregados
7. Auditoria de symlinks/junctions nos caminhos de dados de notificação
root@kitploit:~
powershell -ExecutionPolicy Bypass .\detection\etw_wpn_monitor.ps1

_Monitor ETW: WpnService em execução (PID 6432), sem falhas, 100 eventos/hora, sistema corrigido_
### Regras do Sysmon (`detection/sysmon_wpn_race_detect.xml`)
Seis grupos de regras para monitoramento contÃnuo:
Regra| O que ela captura
---|---
`WPN_EoP_ChildProcess`| svchost (netsvcs) gerando cmd/powershell/wscript
`WPN_PipeAccess`| Conexões a pipes nomeados relacionados a WPN
`WPN_FileCreation`| Criação de arquivos nos diretórios de dados de notificação
`WPN_RegistryTampering`| Gravações no registro em chaves do PushNotifications
`WPN_ProcessAccess`| Handles `PROCESS_ALL_ACCESS` para svchost
`WPN_ThreadInjection`| `CreateRemoteThread` em svchost
Instalação:
root@kitploit:~
sysmon64.exe -accepteula -i detection\sysmon_wpn_race_detect.xml
### Visualizador de Eventos
A atividade do WpnService é registrada em `Microsoft-Windows-PushNotifications-Platform/Operational`. Principais eventos a observar:
* Evento 1225: comandos WPN em nÃvel de transporte
* Rajadas rápidas de eventos (>20/min) — possÃvel spray de corrida
* Eventos de Erro/CrÃtico — possÃvel falha de exploração malsucedida

_Visualizador de Eventos: log operacional do PushNotifications-Platform, ID do evento 1225_
## Diffing de Patch
Principais descobertas do diff de `wpncore.dll`:
* A seção `.text` cresceu **18.432 bytes** (novo código de bloqueio/proteção em 49 funções)
* A seção `.data` cresceu **96 bytes** (novos globais `Wns::s_platformLock` e `Wns::s_platformShutdown`)
* Nenhum novo import foi adicionado — `AcquireSRWLockShared`/`ReleaseSRWLockShared` já estavam na tabela de importação
* Novo destruidor RAII: `~unique_any_t<...ReleaseSRWLockExclusive...>` confirma a adição do wrapper de bloqueio
Relatórios completos estão em `reports/`.
## CVEs Relacionados
O CVE-2026-42978 faz parte de um conjunto de 9 vulnerabilidades relacionadas a WPN corrigidas em junho de 2026:
CVE| Tipo| CWE
---|---|---
CVE-2026-42977| EoP| Condição de Corrida
**CVE-2026-42978**| **EoP**| **Condição de Corrida**
CVE-2026-42979| EoP| Condição de Corrida
CVE-2026-42991| EoP| Condição de Corrida
CVE-2026-42969| Divulgação de Informações| Condição de Corrida
CVE-2026-42970| Divulgação de Informações| Condição de Corrida
CVE-2026-42973| Divulgação de Informações| Condição de Corrida
CVE-2026-26167| EoP| —
CVE-2026-32160| EoP| —
## Estrutura do Projeto
root@kitploit:~
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
## Requisitos
* Windows 10/11 (para executar o laboratório e as ferramentas de detecção)
* GCC / MinGW (para compilar o laboratório em C)
* Python 3.9+ (para scripts de diff)
* Ghidra 11+ (para decompilação headless, opcional)
* Sysmon (para regras de detecção, opcional)
## Aviso Legal
Este projeto é para **pesquisa de segurança defensiva**. A vulnerabilidade foi corrigida. Nenhum código de exploit armado está incluÃdo. O laboratório TOCTOU demonstra a classe de bug em um serviço simulado independente — ele não interage com o WpnService nem com qualquer componente do sistema.
Certifique-se de que seu Windows esteja atualizado. Se `etw_wpn_monitor.ps1` informar que seu sistema não está corrigido — instale a atualização cumulativa de junho de 2026 imediatamente.
## Contribuindo
Se você tiver algo a acrescentar — melhores regras de detecção, PoC de exploit, uma sessão de Version Tracking no Ghidra, assinaturas YARA ou análise dos CVEs relacionados deste conjunto — PRs são bem-vindos.
Ideias para contribuições:
* Regras Sigma para o lado SIEM da detecção
* Análise mais aprofundada de CVE-2026-42977/42979/42991 (mesma famÃlia de corrida do WPN)
* Análise de heap baseada em WinDbg do uso após liberação
* Monitor ETW aprimorado com detecção de rajadas ALPC em tempo real
* Recomendações de regras do Windows Defender ASR
Abra uma issue se tiver dúvidas ou quiser discutir a pesquisa.
## Licença
MIT