
CVE-2026-97798 Windows Error Reporting - Injection de commande vers SYSTEM
[!WARNING] Ce dépôt est destiné à la recherche autorisée sur les vulnérabilités et à la validation en laboratoire contrôlé. La preuve de concept échoue de manière sûre lorsqu'elle ne peut pas identifier exactement une implémentation compatible de
faultrep.dll!SpawnDataCollector.
CVE-2026-97798 est une vulnérabilité locale d'élévation de privilèges dans le
chemin Time Travel Debugging de Windows Error Reporting (WER). Un appelant non
privilégié peut préserver une syntaxe de ligne de commande contrôlée par
l'attaquant à travers la frontière de privilèges de WER. Le collecteur élevé
concatène ensuite cette entrée dans une ligne de commande TTTracer.exe sans
préserver les frontières d'arguments. Les commutateurs injectés -out et
-launch sont donc interprétés par l'enregistreur TTD comme des options
d'enregistreur, permettant le lancement d'un exécutable choisi par l'attaquant
avec le jeton élevé du collecteur.
Le PoC monofichier inclus transforme cette primitive en un shell interactif
NT AUTHORITY\SYSTEM. Il a été validé à la fois depuis un compte utilisateur
standard et depuis un compte administrateur d'intégrité moyenne, filtré par UAC.

| Chemin | Description |
|---|---|
src/CVE-2026-97798.cpp | Source complète de l'exploit en image unique |
bin/CVE-2026-97798.exe | Build de laboratoire x64 reproductible |
build.ps1 | Script de build LLVM-MinGW déterministe |
assets/system-shell.png | Preuve whoami capturée depuis la VM isolée |
Aucun PDF de rapport n'est encore inclus ; l'article long est toujours en cours de rédaction.
Le flux vulnérable traverse plusieurs composants :
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 requête contient une valeur Process qui commence par un exécutable légitime mais ajoute des commutateurs TTD supplémentaires. L'implémentation vulnérable applique une blocklist faible basée sur le nom exact, puis formate directement la chaîne de processus dans la ligne de commande privilégiée de l'enregistreur. Comme la valeur du processus n'est pas sérialisée en un seul argument, ses espaces deviennent des délimiteurs d'arguments lorsque TTTracer analyse le résultat.
Conceptuellement, la portion injectée est :
Process=CVE-2026-97798-payload.exe
-out ..\..\Users\Public\Documents\CVE97798\trace
-launch ..\..\Users\Public\Documents\CVE97798\CVE-2026-97798-payload.exe
--payload;
Les chemins relatifs sont délibérés. WER intègre également ces données dans un
nom de chemin .ttdconfig ; un préfixe de lecteur absolu introduit un deux-points et échoue
avec ERROR_INVALID_NAME. Le chemin de style traversée évite ce conflit d'analyseur
tout en se normalisant vers le répertoire public contrôlé.
Il s'agit d'un problème d'injection d'arguments (CWE-88), et non d'une injection
classique de commande shell. Aucun cmd.exe /c n'est requis au niveau du point de
vulnérabilité : TTTracer lui-même interprète les commutateurs injectés.
L'utilisation normale ne nécessite que CVE-2026-97798.exe. La même image PE se
réinvoque elle-même dans plusieurs modes internes :
faultrep.dll!SpawnDataCollector dynamiquement à partir de la fonction unique qui
contient l'opcode du collecteur WER et les invariants du protocole. Aucune RVA
spécifique à une build n'est intégrée.cmd.exe via des named pipes, permettant à une
console visible de session utilisateur d'interagir avec un shell créé dans la session 0.L'artefact distribué reste un seul EXE. À l'exécution, il prépare deux alias de
cette même image : un pour la console intégrée et un pour le payload élevé. L'alias
du payload est également utilisé comme cible -onlaunch de TTTracer, afin que
l'enregistreur observe le processus qu'il lance réellement et se termine lorsque cette
courte étape de payload se termine. Le PoC réinitialise l'état TTD obsolète avant chaque
déclenchement et de nouveau après un payload réussi, empêchant une exécution interrompue de faire échouer
l'exécution suivante avec HRESULT 0x80070032.
Pour un utilisateur standard, le chemin du collecteur élevé atteint directement SYSTEM. Pour un
administrateur filtré par UAC, WER lance d'abord le payload avec le jeton administrateur élevé
lié — le nom du compte reste inchangé, mais
TokenIsElevated=true. Le PoC se réinvoque ensuite lui-même en tant que SYSTEM. Il tente
d'abord la création directe d'un processus avec jeton SYSTEM et utilise une entrée Task Scheduler
éphémère comme solution de repli ; la tâche de repli est supprimée immédiatement après le lancement.
| Composant | Valeur validée |
|---|---|
| OS | Windows 11 24H2 x64, build 26100.9550 |
faultrep.dll vulnérable | 10.0.26100.9549 |
| Comparaison corrigée | faultrep.dll 10.0.26100.9711 |
| TTTracer / TTDRecord | 1.11.580.0 |
| Vérification du résolveur dynamique | 9549 : RVA 0x4CEB0 ; 9711 : RVA 0x4E40C |
| SHA-256 du PoC | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
Le résolveur parcourt la table d'exceptions x64 et exige une fonction avec la
configuration de grande trame du collecteur, l'opcode de requête 0xD0000002, la taille de message
0x578, le délai d'attente 10000, et ses trois mappages d'erreur d'attente/service
attendus. Il a été vérifié contre les deux builds faultrep.dll fournies et
testé négativement contre des images PE sans rapport. Aucun numéro de build ni RVA n'est stocké.
Si une future build modifie suffisamment cette implémentation pour rendre la correspondance
ambiguë ou incomplète, le PoC s'arrête avant d'effectuer un appel indirect.
Utilisez un instantané jetable de la build vulnérable. Depuis un PowerShell ou une Invite de commandes non élevé :
.\bin\CVE-2026-97798.exe
En cas de succès, la console intégrée affiche :
[CVE-2026-97798] Exploit shell token:
nt authority\system
La preuve lisible par machine est écrite ci-dessous :
C:\Users\Public\Documents\CVE97798\system-proof.txt
Le résolveur peut également être testé sur une DLL x64 hors ligne sans déclencher la vulnérabilité :
.\bin\CVE-2026-97798.exe --resolve C:\path\to\faultrep.dll
Pour vérifier au préalable la DLL système installée, également sans déclencher le chemin vulnérable :
.\bin\CVE-2026-97798.exe --preflight
Une validation réussie d'administrateur filtré a produit :
cve=CVE-2026-97798
user=NT AUTHORITY\SYSTEM
is_system=true
is_elevated=true
payload_session=0
shell_session=0
spawn_error=0
Installez une chaîne d'outils LLVM-MinGW x64 et placez x86_64-w64-mingw32-clang++.exe dans le PATH, ou passez son chemin absolu explicitement :
.\build.ps1
# or
.\build.ps1 -Compiler C:\toolchains\llvm-mingw\bin\x86_64-w64-mingw32-clang++.exe