[!WARNING] 本仓库用于经授权的漏洞研究与受控实验室验证。当无法准确识别出唯一一个兼容的
faultrep.dll!SpawnDataCollector实现时,该概念验证程序会安全失败(fail closed)。
CVE-2026-97798 是 Windows 错误报告(WER)时间旅行调试路径中的一个本地权限提升漏洞。非特权调用者可以跨越 WER 权限边界保留攻击者控制的命令行语法。提权后的收集器随后将该输入拼接进 TTTracer.exe 命令行,而未保留参数边界。因此,注入的 -out 和 -launch 开关会被 TTD 记录器解释为记录器选项,从而允许以收集器的提权令牌启动攻击者选定的可执行文件。
随附的单文件 PoC 将该原语转化为交互式 NT AUTHORITY\SYSTEM shell。该 PoC 已在标准用户账户以及中等完整性、经 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),而非传统的 shell 命令注入。在易受攻击的接收点不需要 cmd.exe /c:TTTracer 自身会解释注入的开关。
正常使用仅需要 CVE-2026-97798.exe。同一个 PE 映像会以多种内部模式重新进入自身:
faultrep.dll!SpawnDataCollector。不嵌入任何特定于构建的 RVA。cmd.exe,允许可见的用户会话控制台与在会话 0 中创建的 shell 进行交互。分发的产物仍然是一个 EXE。在运行时,它会暂存该同一映像的两个别名:一个用于集成控制台,一个用于提权载荷。载荷别名还用作 TTTracer 的 -onlaunch 目标,因此记录器会观察它实际启动的进程,并在该短暂载荷阶段结束时退出。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 |
| PoC SHA-256 | 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
构建是静态的,并抑制了 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 开关的命令行,以及从用户可写目录启动的记录器子进程。应将 WER 活动、TTTracer 命令行、创建者 PID、令牌提升和文件哈希关联起来分析,而不是仅对 TTTracer 单独告警。
安装包含 faultrep.dll 版本 10.0.26100.9711 或更高替代更新的 Microsoft 更新。修正后的实现会在不受信任的数据到达记录器之前禁用旧版 TTD 请求路径。