
CVE-2026-42978 — Condição de corrida Use-After-Free nas Notificações de Push do Windows (WpnService). Diff de patch, análise de causa raiz, laboratório TOCTOU, regras de detecção Sysmon/ETW.
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.
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.
// 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
// 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:
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.s_platformShutdown — se o desligamento já começou, saia imediatamente com E_APPLICATION_EXITING.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.
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.
O WpnService é executado como SYSTEM. Se a corrida for vencida:
NotificationPlatform liberado pode ser recuperada e preenchida com dados controlados pelo atacante (heap spray)NT AUTHORITY\SYSTEMA 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.
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.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.
Requer GCC (MinGW). A partir do diretório lab/:
build.bat
Terminal 1:
vulnerable_service.exe
Terminal 2:
race_attacker.exe 5
Depois compare com vulnerable_service.exe --patched — mesmo ataque, zero corridas detectadas.
detection/etw_wpn_monitor.ps1)Script PowerShell que verifica 7 indicadores:
powershell -ExecutionPolicy Bypass .\detection\etw_wpn_monitor.ps1
Monitor ETW: WpnService em execução (PID 6432), sem falhas, 100 eventos/hora, sistema corrigido
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:
sysmon64.exe -accepteula -i detection\sysmon_wpn_race_detect.xml
A atividade do WpnService é registrada em Microsoft-Windows-PushNotifications-Platform/Operational. Principais eventos a observar:
Visualizador de Eventos: log operacional do PushNotifications-Platform, ID do evento 1225
Principais descobertas do diff de wpncore.dll:
.text cresceu 18.432 bytes (novo código de bloqueio/proteção em 49 funções).data cresceu 96 bytes (novos globais Wns::s_platformLock e Wns::s_platformShutdown)AcquireSRWLockShared/ReleaseSRWLockShared já estavam na tabela de importação~unique_any_t<...ReleaseSRWLockExclusive...> confirma a adição do wrapper de bloqueioRelatórios completos estão em reports/.
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 | — |
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
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.
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:
Abra uma issue se tiver dúvidas ou quiser discutir a pesquisa.
MIT