
CVE-2026-97798 Windows Error Reporting - Iniezione di comandi fino a SYSTEM
[!WARNING] Questo repository è destinato alla ricerca autorizzata sulle vulnerabilità e alla validazione controllata in laboratorio. La proof of concept fallisce in modo sicuro quando non riesce a identificare esattamente un'implementazione compatibile di
faultrep.dll!SpawnDataCollector.
CVE-2026-97798 è una vulnerabilità locale di escalation dei privilegi nel percorso di Time Travel Debugging di Windows Error Reporting (WER). Un chiamante non privilegiato può preservare una sintassi della riga di comando controllata dall'attaccante attraverso il confine dei privilegi di WER. Il collector elevato concatena successivamente quell'input in una riga di comando di TTTracer.exe senza preservare i confini degli argomenti. Gli switch iniettati -out e -launch vengono quindi interpretati dal registratore TTD come opzioni del registratore, consentendo di avviare un eseguibile scelto dall'attaccante con il token elevato del collector.
La PoC inclusa in un singolo file trasforma questa primitiva in una shell interattiva NT AUTHORITY\SYSTEM. È stata validata sia da un utente standard sia da un account amministratore a integrità media, filtrato da UAC.

| Percorso | Descrizione |
|---|---|
src/CVE-2026-97798.cpp | Codice sorgente completo dell'exploit in un singolo file |
bin/CVE-2026-97798.exe | Build di laboratorio x64 riproducibile |
build.ps1 | Script di build deterministico per LLVM-MinGW |
assets/system-shell.png | Prova catturata di whoami dalla VM isolata |
Non sono ancora inclusi PDF di report; il documento esteso è ancora in fase di revisione.
Il flusso vulnerabile attraversa diversi componenti:
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
La richiesta contiene un valore Process che inizia con un eseguibile legittimo
ma aggiunge ulteriori parametri TTD. L'implementazione vulnerabile applica una
blocklist debole basata sulla corrispondenza esatta del nome e successivamente formatta la stringa del processo direttamente nella
riga di comando privilegiata del recorder. Poiché il valore del processo non viene serializzato
come un singolo argomento, i suoi spazi diventano delimitatori di argomenti quando TTTracer analizza il
risultato.
Concettualmente, la porzione iniettata è:
Process=CVE-2026-97798-payload.exe
-out ..\..\Users\Public\Documents\CVE97798\trace
-launch ..\..\Users\Public\Documents\CVE97798\CVE-2026-97798-payload.exe
--payload;
I percorsi relativi sono intenzionali. WER incorpora inoltre questi dati in un
nome di percorso .ttdconfig; un prefisso di unità assoluto introduce i due punti e fallisce
con ERROR_INVALID_NAME. Il percorso in stile traversal evita quel conflitto del parser
normalizzandosi al contempo nella directory pubblica controllata.
Si tratta di un problema di injection di argomenti (CWE-88), non di una convenzionale
injection di comandi shell. Non è necessario alcun cmd.exe /c nel sink vulnerabile: TTTracer stesso
interpreta gli switch iniettati.
Il normale utilizzo richiede solo CVE-2026-97798.exe. La stessa immagine PE rientra
in se stessa in diverse modalità interne:
faultrep.dll!SpawnDataCollector dinamicamente dalla funzione univoca che
contiene l'opcode del collector WER e le invarianti del protocollo. Nessun
RVA specifico della build è incorporato.cmd.exe tramite named pipe, consentendo a una console
visibile nella sessione utente di interagire con una shell creata nella sessione 0.L'artefatto distribuito rimane un singolo EXE. A runtime prepara due alias di
quella stessa immagine: uno per la console integrata e uno per il payload
elevato. L'alias del payload viene usato anche come target -onlaunch di TTTracer, così il
recorder osserva il processo che effettivamente avvia ed esce quando quella breve
fase del payload termina. Il PoC reimposta lo stato TTD obsoleto prima di ogni trigger e di nuovo
dopo un payload riuscito, impedendo che un'esecuzione interrotta faccia fallire la successiva
con HRESULT 0x80070032.
Per un utente standard, il percorso del collector elevato raggiunge direttamente SYSTEM. Per un
amministratore filtrato da UAC, WER avvia prima il payload con il token amministratore elevato collegato—il nome dell'account rimane invariato, ma
TokenIsElevated=true. Il PoC quindi rientra nella stessa immagine come SYSTEM. Tenta
prima la creazione diretta di un processo con token SYSTEM e usa una voce di Task Scheduler di breve durata come fallback; l'attività di fallback viene eliminata immediatamente dopo l'avvio.
| Componente | Valore validato |
|---|---|
| OS | Windows 11 24H2 x64, build 26100.9550 |
faultrep.dll vulnerabile | 10.0.26100.9549 |
| Confronto con versione corretta | faultrep.dll 10.0.26100.9711 |
| TTTracer / TTDRecord | 1.11.580.0 |
| Verifica del resolver dinamico | 9549: RVA 0x4CEB0; 9711: RVA 0x4E40C |
| SHA-256 del PoC | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
Il resolver percorre la tabella delle eccezioni x64 e richiede una funzione con
la configurazione del large frame del collector, l'opcode di richiesta 0xD0000002, la dimensione del messaggio
0x578, il timeout di attesa 10000 e le sue tre mappature attese di errore wait/service.
È stato verificato su entrambe le build faultrep.dll fornite e
testato negativamente su immagini PE non correlate. Non viene memorizzato alcun numero di build o RVA.
Se una build futura modifica tale implementazione abbastanza da rendere la corrispondenza
ambigua o incompleta, il PoC si arresta prima di effettuare una chiamata indiretta.
Usare uno snapshot usa e getta della build vulnerabile. Da un PowerShell o Prompt dei comandi non elevato:
.\bin\CVE-2026-97798.exe
In caso di successo, la console integrata stampa:
[CVE-2026-97798] Exploit shell token:
nt authority\system
La prova leggibile dalla macchina è scritta di seguito:
C:\Users\Public\Documents\CVE97798\system-proof.txt
Il resolver può anche essere testato su una DLL x64 offline senza attivare la vulnerabilità:
.\bin\CVE-2026-97798.exe --resolve C:\path\to\faultrep.dll
Per verificare in anticipo la DLL di sistema installata, anche senza attivare il percorso vulnerabile:
.\bin\CVE-2026-97798.exe --preflight
Una validazione riuscita dell'amministratore filtrato ha prodotto:
cve=CVE-2026-97798
user=NT AUTHORITY\SYSTEM
is_system=true
is_elevated=true
payload_session=0
shell_session=0
spawn_error=0
Installa una toolchain x64 LLVM-MinGW
e inserisci x86_64-w64-mingw32-clang++.exe nel PATH, oppure passa il suo
percorso assoluto esplicitamente:
.\build.ps1