
CVE-2026-97798 Windows Error Reporting – Befehlsinjektion zu SYSTEM
[!WARNING] Dieses Repository dient der autorisierten Schwachstellenforschung und der Validierung in kontrollierten Laboren. Der Proof of Concept schlägt sicher fehl, wenn er nicht genau eine kompatible
faultrep.dll!SpawnDataCollector-Implementierung identifizieren kann.
CVE-2026-97798 ist eine lokale Privilegienerweiterungsschwachstelle im Time
Travel Debugging-Pfad des Windows-Fehlerberichts (WER). Ein nicht privilegierter
Aufrufer kann eine vom Angreifer kontrollierte Befehlszeilensyntax über die
WER-Privilegiengrenze hinweg erhalten. Der erhöhte Collector verkettet diese
Eingabe später zu einer TTTracer.exe-Befehlszeile, ohne Argumentgrenzen zu
wahren. Injizierte -out- und -launch-Schalter werden daher vom TTD-Recorder
als Recorder-Optionen interpretiert, wodurch eine vom Angreifer ausgewählte
ausführbare Datei mit dem erhöhten Token des Collectors gestartet werden kann.
Der enthaltene Single-File-PoC verwandelt dieses Primitiv in eine interaktive
NT AUTHORITY\SYSTEM-Shell. Er wurde sowohl aus einem Standardbenutzerkonto als
auch aus einem mittelintegren, UAC-gefilterten Administratorkonto validiert.

| Pfad | Beschreibung |
|---|---|
src/CVE-2026-97798.cpp | Vollständiger Single-Image-Exploit-Quellcode |
bin/CVE-2026-97798.exe | Reproduzierbarer x64-Labor-Build |
build.ps1 | Deterministisches LLVM-MinGW-Build-Skript |
assets/system-shell.png | Erfasster whoami-Nachweis aus der isolierten VM |
Es sind noch keine Bericht-PDFs enthalten; das ausführliche Paper wird derzeit noch überarbeitet.
Der anfällige Ablauf durchläuft mehrere Komponenten:
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
Die Anfrage enthält einen Process-Wert, der mit einer legitimen ausführbaren Datei beginnt, aber zusätzliche TTD-Schalter anhängt. Die verwundbare Implementierung wendet eine schwache Blockliste mit exakten Namen an und formatiert die Prozesszeichenfolge später direkt in die privilegierte Recorder-Kommandozeile. Da der Prozesswert nicht als ein Argument serialisiert wird, werden seine Leerzeichen zu Argumenttrennzeichen, wenn TTTracer das Ergebnis parst.
Konzeptionell lautet der injizierte Teil:
Process=CVE-2026-97798-payload.exe
-out ..\..\Users\Public\Documents\CVE97798\trace
-launch ..\..\Users\Public\Documents\CVE97798\CVE-2026-97798-payload.exe
--payload;
Die relativen Pfade sind bewusst gewählt. WER übernimmt diese Daten ebenfalls in einen
.ttdconfig-Pfadnamen; ein absolutes Laufwerkspräfix führt einen Doppelpunkt ein und schlägt
mit ERROR_INVALID_NAME fehl. Der Traversal-artige Pfad vermeidet diesen Parser-Konflikt,
während er auf das kontrollierte öffentliche Verzeichnis normalisiert wird.
Dies ist ein Argument-Injection-Problem (CWE-88), keine herkömmliche Shell-Command-
Injection. Am verwundbaren Sink ist kein cmd.exe /c erforderlich: TTTracer selbst
interpretiert die injizierten Switches.
Die normale Nutzung erfordert nur CVE-2026-97798.exe. Dasselbe PE-Image ruft sich selbst
in mehreren internen Modi erneut auf:
faultrep.dll!SpawnDataCollector dynamisch aus der eindeutigen Funktion auf, die
den WER-Collector-Opcode und die Protokoll-Invarianten enthält. Es ist keine
build-spezifische RVA eingebettet.cmd.exe bereit, sodass eine sichtbare
Konsolen-Sitzung des Benutzers mit einer in Sitzung 0 erstellten Shell interagieren kann.Das verteilte Artefakt bleibt eine einzige EXE. Zur Laufzeit legt es zwei Aliase
desselben Images an: einen für die integrierte Konsole und einen für die erhöhte
Payload. Der Payload-Alias wird auch als -onlaunch-Ziel von TTTracer verwendet, sodass
der Recorder den Prozess beobachtet, den er tatsächlich startet, und beendet wird, wenn
diese kurze Payload-Phase endet. Das PoC setzt veralteten TTD-Zustand vor jedem Auslösen
und erneut nach einer erfolgreichen Payload zurück, wodurch verhindert wird, dass ein
unterbrochener Lauf die nächste Ausführung mit HRESULT 0x80070032 fehlschlagen lässt.
Für einen Standardbenutzer erreicht der erhöhte Collector-Pfad direkt SYSTEM. Bei einem
UAC-gefilterten Administrator startet WER die Payload zunächst mit dem verknüpften hohen
Administrator-Token – der Kontoname bleibt unverändert, aber
TokenIsElevated=true. Das PoC ruft dann dasselbe Image als SYSTEM erneut auf. Es
versucht zuerst die direkte Prozesserstellung mit SYSTEM-Token und verwendet als Fallback
einen kurzlebigen Task-Scheduler-Eintrag; die Fallback-Aufgabe wird unmittelbar nach dem
Start gelöscht.
| Komponente | Validierter Wert |
|---|---|
| OS | Windows 11 24H2 x64, Build 26100.9550 |
Verwundbare faultrep.dll | 10.0.26100.9549 |
| Behobene Vergleichsversion | faultrep.dll 10.0.26100.9711 |
| TTTracer / TTDRecord | 1.11.580.0 |
| Dynamische Resolver-Prüfung | 9549: RVA 0x4CEB0; 9711: RVA 0x4E40C |
| PoC SHA-256 | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
Der Resolver durchläuft die x64-Exception-Tabelle und erfordert eine Funktion mit
dem Large-Frame-Setup des Collectors, dem Request-Opcode 0xD0000002, der Nachrichtengröße
0x578, dem Warte-Timeout 10000 und seinen drei erwarteten Wait/Service-Fehler-
Zuordnungen. Er wurde gegen beide bereitgestellten faultrep.dll-Builds geprüft und
negativ gegen unabhängige PE-Images getestet. Es wird keine Build-Nummer und keine RVA
gespeichert. Wenn ein zukünftiger Build diese Implementierung so weit ändert, dass die
Übereinstimmung mehrdeutig oder unvollständig wird, stoppt das PoC, bevor es einen
indirekten Aufruf ausführt.
Verwenden Sie einen Wegwerf-Snapshot des verwundbaren Builds. Aus einer nicht erhöhten PowerShell oder Eingabeaufforderung:
.\bin\CVE-2026-97798.exe
Bei Erfolg gibt die integrierte Konsole Folgendes aus:
[CVE-2026-97798] Exploit shell token:
nt authority\system
Der maschinenlesbare Nachweis ist darunter geschrieben:
C:\Users\Public\Documents\CVE97798\system-proof.txt
Der Resolver kann auch gegen eine Offline-x64-DLL getestet werden, ohne die Schwachstelle auszulösen:
.\bin\CVE-2026-97798.exe --resolve C:\path\to\faultrep.dll
Um die installierte System-DLL vorab zu prüfen, ebenfalls ohne den verwundbaren Pfad auszulösen:
.\bin\CVE-2026-97798.exe --preflight
Eine erfolgreiche Validierung des gefilterten Administrators ergab:
cve=CVE-2026-97798
user=NT AUTHORITY\SYSTEM
is_system=true
is_elevated=true
payload_session=0
shell_session=0
spawn_error=0
Installiere eine x64-LLVM-MinGW-Toolchain und lege x86_64-w64-mingw32-clang++.exe in PATH ab, oder gib ihren absoluten Pfad explizit an:
.\build.ps1
# or
.\build.ps1 -Compiler C:\toolchains\llvm-mingw\bin\x86_64-w64-mingw32-clang++.exe