
CVE-2026-97798 Windows Error Reporting — внедрение команд с повышением до SYSTEM
[!WARNING] Этот репозиторий предназначен для авторизованных исследований уязвимостей и контролируемой проверки в лабораторных условиях. Proof of concept безопасно завершается с ошибкой, если не удаётся однозначно определить ровно одну совместимую реализацию
faultrep.dll!SpawnDataCollector.
CVE-2026-97798 — это локальная уязвимость повышения привилегий в пути Time Travel Debugging службы Windows Error Reporting (WER). Непривилегированный вызывающий процесс может сохранить контролируемый атакующим синтаксис командной строки при пересечении границы привилегий WER. Повышенный сборщик впоследствии объединяет эти входные данные в командную строку TTTracer.exe, не сохраняя границы аргументов. Поэтому внедрённые ключи -out и -launch интерпретируются записывающим устройством TTD как параметры записывающего устройства, что позволяет запустить выбранный атакующим исполняемый файл с повышенным токеном сборщика.
Входящий в комплект однофайловый PoC превращает этот примитив в интерактивную оболочку NT AUTHORITY\SYSTEM. Он был проверен как из учётной записи обычного пользователя, так и из учётной записи администратора со средним уровнем целостности, отфильтрованной UAC.

| Путь | Описание |
|---|---|
src/CVE-2026-97798.cpp | Полный исходный код эксплойта в виде одного файла |
bin/CVE-2026-97798.exe | Воспроизводимая лабораторная сборка x64 |
build.ps1 | Детерминированный скрипт сборки LLVM-MinGW |
assets/system-shell.png | Зафиксированное доказательство выполнения whoami из изолированной виртуальной машины |
PDF-отчёты пока не включены; полная статья всё ещё редактируется.
Уязвимый поток затрагивает несколько компонентов:
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
Запрос содержит значение Process, которое начинается с легитимного исполняемого файла, но добавляет дополнительные ключи TTD. Уязвимая реализация применяет слабый блоклист точных имён, а затем напрямую форматирует строку процесса в командную строку привилегированного рекордера. Поскольку значение процесса не сериализуется как один аргумент, его пробелы становятся разделителями аргументов при разборе результата TTTracer.
Концептуально внедрённая часть выглядит так:
Process=CVE-2026-97798-payload.exe
-out ..\..\Users\Public\Documents\CVE97798\trace
-launch ..\..\Users\Public\Documents\CVE97798\CVE-2026-97798-payload.exe
--payload;
Относительные пути выбраны намеренно. WER также включает эти данные в
имя пути .ttdconfig; абсолютный префикс диска вносит двоеточие и приводит к
ошибке ERROR_INVALID_NAME. Путь в стиле обхода каталогов позволяет избежать этого конфликта
парсера, при этом нормализуясь в контролируемый публичный каталог.
Это проблема инъекции аргументов (CWE-88), а не обычная инъекция
команд оболочки. На уязвимой точке входа не требуется cmd.exe /c: сам TTTracer
интерпретирует внедрённые ключи.
Для обычного использования требуется только CVE-2026-97798.exe. Один и тот же PE-образ повторно
запускает себя в нескольких внутренних режимах:
faultrep.dll!SpawnDataCollector по уникальной функции, которая
содержит опкод коллектора WER и инварианты протокола. RVA, зависящий от сборки, не
встраивается.cmd.exe через именованные каналы, позволяя видимой
консоли пользовательской сессии взаимодействовать с оболочкой, созданной в сессии 0.Распространяемый артефакт остаётся одним EXE. Во время выполнения он размещает два псевдонима
этого же образа: один для встроенной консоли и один для привилегированной
полезной нагрузки. Псевдоним полезной нагрузки также используется как цель -onlaunch для TTTracer, поэтому
записывающее устройство наблюдает за процессом, который оно фактически запускает, и завершается, когда эта короткая
стадия полезной нагрузки заканчивается. PoC сбрасывает устаревшее состояние TTD перед каждым запуском и снова
после успешной полезной нагрузки, предотвращая сбой следующего
выполнения с HRESULT 0x80070032 из-за прерванного запуска.
Для стандартного пользователя путь привилегированного коллектора напрямую достигает SYSTEM. Для
администратора, отфильтрованного UAC, WER сначала запускает полезную нагрузку со связанным высокопривилегированным
токеном администратора — имя учётной записи остаётся неизменным, но
TokenIsElevated=true. Затем PoC повторно входит в тот же образ как SYSTEM. Он сначала пытается
напрямую создать процесс с токеном SYSTEM и использует кратковременную запись в планировщике задач
как запасной вариант; резервная задача удаляется сразу после запуска.
| Компонент | Проверенное значение |
|---|---|
| ОС | Windows 11 24H2 x64, сборка 26100.9550 |
Уязвимая faultrep.dll | 10.0.26100.9549 |
| Исправленная для сравнения | faultrep.dll 10.0.26100.9711 |
| TTTracer / TTDRecord | 1.11.580.0 |
| Проверка динамического резолвера | 9549: RVA 0x4CEB0; 9711: RVA 0x4E40C |
| SHA-256 PoC | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
Резолвер обходит таблицу исключений x64 и требует одну функцию с
настройкой большого кадра коллектора, опкодом запроса 0xD0000002, размером сообщения
0x578, тайм-аутом ожидания 10000 и тремя ожидаемыми сопоставлениями ошибок ожидания/обслуживания.
Он был проверен на обеих предоставленных сборках faultrep.dll и
негативно протестирован на несвязанных PE-образах. Номер сборки или RVA не сохраняется.
Если будущая сборка изменит эту реализацию настолько, что совпадение станет
неоднозначным или неполным, PoC остановится до выполнения косвенного вызова.
Используйте одноразовый снимок уязвимой сборки. Из неэлевированного PowerShell или командной строки:
.\bin\CVE-2026-97798.exe
При успехе встроенная консоль выводит:
[CVE-2026-97798] Exploit shell token:
nt authority\system
Машиночитаемое доказательство записано ниже:
C:\Users\Public\Documents\CVE97798\system-proof.txt
Также можно протестировать резолвер на офлайн x64 DLL, не вызывая уязвимость:
.\bin\CVE-2026-97798.exe --resolve C:\path\to\faultrep.dll
Чтобы выполнить предварительную проверку установленной системной DLL, также не активируя уязвимый путь:
.\bin\CVE-2026-97798.exe --preflight
Успешная проверка отфильтрованного администратора дала:
cve=CVE-2026-97798
user=NT AUTHORITY\SYSTEM
is_system=true
is_elevated=true
payload_session=0
shell_session=0
spawn_error=0
Установите x64-инструментарий LLVM-MinGW
и поместите x86_64-w64-mingw32-clang++.exe в PATH или укажите его
абсолютный путь явно:
.\build.ps1
# or
.\build.ps1 -Compiler C:\toolchains\llvm-mingw\bin\x86_64-w64-mingw32-clang++.exe