Sploitus

Exploit for CVE-2026-42978-PoC-Research

kitploit · 2026-08-27

Exploit Code

MARKDOWN286 lines
## 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(...);
    }
    

![Desmontagem no Ghidra do ToastUnblockAll vulnerável](https://assets.kitploit.com/production/public/readmes/26075/ec530d0ab621af9682ca594b3b12cc3e74345c10cd150faee75186ab002fa1ce.png)   
_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.

![Demonstração de condição de corrida TOCTOU](https://assets.kitploit.com/production/public/readmes/26075/c4a4559dbec8d35dbdcae0d8d771c38008b65199732f6c0d7bb3f557b0d6e50f.png)   
_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
    

![Saída do monitor ETW](https://assets.kitploit.com/production/public/readmes/26075/c99690e65a6b4769bc318f14c3c93986f15a48049a847864e6d4930c5058d40f.png)   
_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



![Evento WPN no Visualizador de Eventos](https://assets.kitploit.com/production/public/readmes/26075/cd05ef217f502de46c30bbd19557416a2fa124b126debae5dd34ddaedf6e6183.png)   
_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