
CVE-2026-97798 Windows Error Reporting - Injeção de Comando para SYSTEM
[!WARNING] Este repositório destina-se a pesquisa de vulnerabilidades autorizada e validação em laboratório controlado. A prova de conceito falha de forma segura quando não consegue identificar exatamente uma implementação compatível de
faultrep.dll!SpawnDataCollector.
CVE-2026-97798 é uma vulnerabilidade local de elevação de privilégios no caminho de Time Travel Debugging do Windows Error Reporting (WER). Um chamador sem privilégios pode preservar sintaxe de linha de comando controlada pelo atacante através da fronteira de privilégios do WER. O coletor elevado posteriormente concatena essa entrada numa linha de comando de TTTracer.exe sem preservar os limites dos argumentos. Os switches injetados -out e -launch são, portanto, interpretados pelo gravador TTD como opções do gravador, permitindo que um executável escolhido pelo atacante seja lançado com o token elevado do coletor.
O PoC incluído num único ficheiro transforma essa primitiva numa shell interativa NT AUTHORITY\SYSTEM. Foi validado tanto a partir de uma conta de utilizador padrão como de uma conta de administrador de integridade média, filtrada pelo UAC.

| Caminho | Descrição |
|---|---|
src/CVE-2026-97798.cpp | Código-fonte completo do exploit em imagem única |
bin/CVE-2026-97798.exe | Compilação de laboratório x64 reproduzível |
build.ps1 | Script de compilação determinístico LLVM-MinGW |
assets/system-shell.png | Prova de whoami capturada na VM isolada |
Ainda não estão incluídos PDFs de relatório; o artigo completo ainda está a ser editado.
O fluxo vulnerável atravessa vários componentes:
low/medium-integrity process
-> faultrep.dll!CElevatedDataCollection::ControlTimeTravelDebugging
-> faultrep.dll!SpawnDataCollector
-> Windows Error Reporting service (elevated collector)
-> CDataCollection::ControlTimeTravelDebugging
-> TtdControl::LaunchRecordingProcess
-> TTTracer.exe / TTDRecord.dll command-line parser
-> attacker-controlled -launch target
A solicitação contém um valor Process que começa com um executável legítimo
mas acrescenta opções TTD adicionais. A implementação vulnerável aplica uma
blocklist fraca baseada em nome exato e, posteriormente, formata a string do processo diretamente na
linha de comando privilegiada do gravador. Como o valor do processo não é serializado
como um único argumento, seus espaços tornam-se delimitadores de argumentos quando o TTTracer analisa o
resultado.
Conceitualmente, a porção injetada é:
Process=CVE-2026-97798-payload.exe
-out ..\..\Users\Public\Documents\CVE97798\trace
-launch ..\..\Users\Public\Documents\CVE97798\CVE-2026-97798-payload.exe
--payload;
Os caminhos relativos são intencionais. O WER também incorpora esses dados num
nome de caminho .ttdconfig; um prefixo de unidade absoluto introduz dois-pontos e falha
com ERROR_INVALID_NAME. O caminho no estilo de travessia evita esse conflito de
analisador enquanto normaliza para o diretório público controlado.
Trata-se de um problema de injeção de argumentos (CWE-88), não de uma injeção
convencional de comando de shell. Não é necessário cmd.exe /c no sink vulnerável: o próprio TTTracer
interpreta os switches injetados.
O uso normal requer apenas CVE-2026-97798.exe. A mesma imagem PE reentra
em si mesma em vários modos internos:
faultrep.dll!SpawnDataCollector dinamicamente a partir da função única que
contém o opcode do coletor WER e as invariantes do protocolo. Nenhum RVA específico da build é incorporado.cmd.exe real através de named pipes, permitindo que uma consola visível
da sessão do utilizador interaja com um shell criado na sessão 0.O artefacto distribuído continua a ser um único EXE. Em tempo de execução, prepara dois aliases
dessa mesma imagem: um para a consola integrada e outro para o payload elevado. O alias do payload
também é usado como alvo -onlaunch do TTTracer, para que o gravador observe o processo que realmente lança e termine quando essa curta
fase de payload terminar. O PoC reinicia o estado TTD obsoleto antes de cada acionamento e novamente
após um payload bem-sucedido, evitando que uma execução interrompida faça a execução seguinte falhar
com HRESULT 0x80070032.
Para um utilizador padrão, o caminho do coletor elevado chega diretamente a SYSTEM. Para um
administrador filtrado pelo UAC, o WER lança primeiro o payload com o token de administrador elevado associado — o nome da conta permanece inalterado, mas
TokenIsElevated=true. O PoC reentra então na mesma imagem como SYSTEM. Tenta
primeiro a criação direta de processo com token SYSTEM e usa uma entrada de Task Scheduler de curta duração como fallback; a tarefa de fallback é eliminada imediatamente após o lançamento.
| Componente | Valor validado |
|---|---|
| SO | Windows 11 24H2 x64, build 26100.9550 |
faultrep.dll vulnerável | 10.0.26100.9549 |
| Comparação corrigida | faultrep.dll 10.0.26100.9711 |
| TTTracer / TTDRecord | 1.11.580.0 |
| Verificação do resolvedor dinâmico | 9549: RVA 0x4CEB0; 9711: RVA 0x4E40C |
| SHA-256 do PoC | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
O resolvedor percorre a tabela de exceções x64 e requer uma função com a
configuração de frame grande do coletor, opcode de pedido 0xD0000002, tamanho da mensagem
0x578, timeout de espera 10000, e os seus três mapeamentos esperados de erros de espera/serviço. Foi verificado contra ambas as builds faultrep.dll fornecidas e
testado negativamente contra imagens PE não relacionadas. Nenhum número de build ou RVA é armazenado.
Se uma build futura alterar essa implementação o suficiente para tornar a correspondência
ambígua ou incompleta, o PoC para antes de fazer uma chamada indireta.
Use um snapshot descartável da build vulnerável. A partir de um PowerShell ou Command Prompt não elevado:
.\bin\CVE-2026-97798.exe
Em caso de sucesso, o console integrado exibe:
[CVE-2026-97798] Exploit shell token:
nt authority\system
A prova legível por máquina está escrita abaixo:
C:\Users\Public\Documents\CVE97798\system-proof.txt
O resolver também pode ser testado contra uma DLL x64 offline sem acionar a vulnerabilidade:
.\bin\CVE-2026-97798.exe --resolve C:\path\to\faultrep.dll
Para verificar previamente a DLL do sistema instalada, também sem acionar o caminho vulnerável:
.\bin\CVE-2026-97798.exe --preflight
Uma validação bem-sucedida de administrador filtrado produziu:
cve=CVE-2026-97798
user=NT AUTHORITY\SYSTEM
is_system=true
is_elevated=true
payload_session=0
shell_session=0
spawn_error=0
Instale um toolchain x64 LLVM-MinGW
e coloque x86_64-w64-mingw32-clang++.exe no PATH, ou passe o seu
caminho absoluto explicitamente:
.\build.ps1
# or
.\build.ps1 -Compiler C:\toolchains\llvm-mingw\bin\x86_64-w64-mingw32-clang++.exe
A compilação é estática e suprime o timestamp do linker PE, portanto entradas idênticas de código-fonte e toolchain produzem o mesmo hash do executável.