
CVE-2026-97798 Windows 오류 보고 - SYSTEM 권한으로의 명령 주입
[!WARNING] 이 저장소는 승인된 취약점 연구 및 통제된 실험실 검증을 위한 것입니다. 개념 증명은 호환되는
faultrep.dll!SpawnDataCollector구현을 정확히 하나 식별할 수 없을 때 안전하게 실패합니다.
CVE-2026-97798은 Windows 오류 보고(WER) 시간 여행 디버깅(Time Travel Debugging) 경로의 로컬 권한 상승 취약점입니다. 권한이 없는 호출자는 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 | 격리된 VM에서 캡처한 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
요청에는 합법적인 실행 파일로 시작하지만 추가 TTD 스위치를 덧붙인 Process 값이 포함되어 있습니다. 취약한 구현은 취약한 정확한 이름 기반 차단 목록을 적용한 뒤 나중에 프로세스 문자열을 권한 있는 레코더 명령줄에 직접 포맷팅합니다. 프로세스 값이 하나의 인수로 직렬화되지 않기 때문에, 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를 동적으로 확인합니다. 빌드별 RVA는 포함되지 않습니다.cmd.exe를 노출하여, 표시되는 사용자 세션 콘솔이 세션 0에서 생성된 셸과 상호 작용할 수 있게 합니다.배포되는 아티팩트는 하나의 EXE로 유지됩니다. 런타임에 동일한 이미지의 두 가지 별칭을 준비합니다: 하나는 통합 콘솔용, 하나는 권한 상승된 페이로드용입니다. 페이로드 별칭은 TTTracer의 -onlaunch 대상으로도 사용되므로, 레코더는 실제로 실행하는 프로세스를 관찰하고 해당 짧은 페이로드 단계가 끝나면 종료됩니다. PoC는 각 트리거 전과 성공적인 페이로드 후에 오래된 TTD 상태를 재설정하여, 중단된 실행이 다음 실행을 HRESULT 0x80070032로 실패하게 만드는 것을 방지합니다.
표준 사용자의 경우 권한 상승된 수집기 경로가 SYSTEM에 직접 도달합니다. UAC 필터링된 관리자의 경우 WER이 먼저 연결된 높은 관리자 토큰으로 페이로드를 실행합니다—계정 이름은 변경되지 않지만 TokenIsElevated=true입니다. 그런 다음 PoC는 동일한 이미지를 SYSTEM으로 다시 진입합니다. 먼저 직접 SYSTEM 토큰 프로세스 생성을 시도하고, 대체 수단으로 단기 Task Scheduler 항목을 사용합니다. 대체 작업은 실행 직후 삭제됩니다.
| 구성 요소 | 검증된 값 |
|---|---|
| OS | 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 |
| PoC SHA-256 | C7B8FAFB132D69E9BD5A398AE183107155129C7080A87D56EFE55572450B4147 |
확인자는 x64 예외 테이블을 순회하며 수집기의 대형 프레임 설정, 요청 opcode 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
The resolver는 취약점을 트리거하지 않고 오프라인 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
빌드는 정적이며 PE 링커 타임스탬프를 억제하므로, 동일한 소스와 툴체인 입력은 동일한 실행 파일 해시를 생성합니다.
먼저 PoC 콘솔을 닫으십시오. 관리자 권한의 실험실 콘솔에서 TTD 상태가 여전히 활성 상태로 남아 있는 경우:
Stop-Process -Name TTTracer,TTDInject -Force -ErrorAction SilentlyContinue
C:\Windows\System32\TTTracer.exe -cleanup
Remove-Item -Recurse -Force C:\Users\Public\Documents\CVE97798
일회용 VM 스냅샷을 되돌리는 것이 권장되는 최종 정리 방법입니다.
유용한 텔레메트리에는 WER에서 발생하는 예상치 못한 TTTracer.exe 실행, 반복되거나 비정상적인 -onlaunch, -out, -launch 스위치를 포함하는 명령줄, 그리고 사용자가 쓰기 가능한 디렉터리에서 실행되는 레코더 자식 프로세스가 포함됩니다. TTTracer 단독으로 경보를 발생시키기보다는 WER 활동, TTTracer 명령줄, 생성자 PID, 토큰 권한 상승, 파일 해시를 함께 연관 지어 분석하십시오.
faultrep.dll 버전 10.0.26100.9711 이상 또는 이를 대체하는 이후 업데이트가 포함된 Microsoft 업데이트를 설치하십시오. 수정된 구현은 신뢰할 수 없는 데이터가 레코더에 도달하기 전에 레거시 TTD 요청 경로를 비활성화합니다.