
PoC autocontido e análise para CVE-2026-94300, um use-after-free de GSS-TSIG no BIND 9.20.29, com um modelo assistido por depurador da cadeia de vazamento até execução de código.
Nota: Esta análise e PoC foram produzidos substancialmente com assistência de IA ("remendo de IA"). Toda afirmação sobre código, diff e medição deve ser verificada contra as fontes citadas antes de ser utilizada.
Pasta PoC autocontida para a cadeia de exploração da CVE-2026-94300 (BIND 9.20.29 com GSS-TSIG, krb5 1.20.1, jemalloc 5.3.0).
O que está comprovado aqui: Um conjunto de endereços vazado (aqui a partir do gdb) é suficiente para construir execução de código no
processo named a partir das primitivas medidas. O exploit consome o vazamento de
docker logs; ele não contém literais de endereço.
O que é explicitamente um modelo aqui (e declarado como tal no relatório):
| Suposição | Motivo |
|---|---|
| Vazamento a partir do gdb | A CVE não possui primitiva de vazamento de informação; um vazamento real teria que vir de outro bug |
ASLR desativado (setarch -R) | sem um vazamento não há endereços de heap/código |
| Controle de conteúdo de objeto injetado via gdb | a recuperação do slot de 8 bytes liberado não teve sucesso no caminho real com os meios examinados aqui (4,7M tentativas, 0 acertos) — um obstáculo documentado, não uma prova de impossibilidade |
Nenhum RCE remoto demonstrado e nenhuma persistência. O comando é fornecido via --cmd no exploit: host/exploit.py o entrega pelo canal de controle do Docker (docker exec, a mesma autoridade que o operador já possui) para dentro do contêiner; o exploit em si
envia apenas os endereços vazados e o pacote capturado. O payload adicionalmente escreve a linha RCE-PROOF (para verificação) e encerra o 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
| Caminho | Finalidade |
|---|---|
docker/Dockerfile | Imagem da vítima: BIND 9.20.29 do tarball do ISC + gdb + KDC + drivers do laboratório |
etc/ | krb5.conf, kdc.conf, named.conf, zona (copiados para /etc pela imagem) |
host/exploit.py | Exploit do host: lê docker logs, valida, reproduz via UDP, verifica o marcador |
lab/rce_victim.sh | Driver no contêiner: named sob gdb, captura sem envio, vazamento, espera |
lab/rce_model.py | Modelo gdb: breakpoints, bloco de vazamento, arming, observação do dispatch |
lab/rce_leak.py | Estágio de vazamento: endereços + wire_b64 → stdout/arquivo |
lab/rce_exploit.py | Estágio de exploit no contêiner: constrói objeto falso a partir do vazamento, reclaim, dispatch |
lab/rce_shim.c | Shim de página fixa: tabela falsa, template falso de dns_db_t, payload |
lab/replay-lab.py | Captura TKEY (--no-send) |
lab/gss_context_lab.py | Auxiliar de contexto GSS para a captura |
lab/start.sh, lab/named.replay.conf | Bootstrap de KDC/keytab/zona, configuração do named |
RACE.md | Explicação da corrida no contexto GSS-TSIG compartilhado: compartilhamento, acessos, gatilho, medições, escopo |
VERIFY.md | Verificação das três alegações contra o diff do código-fonte 9.20.29 → 9.20.30 (bloqueio GSS-TSIG, dump destrutivo do keyring, escopo do RCE) |
EXPLOIT.md | Descrição do exploit com evidências de código e Mermaid |
USAGE.md | Build, execução, saídas esperadas, solução de problemas |
ANAYLSE.md | Adendo de divulgação pronto para publicação (reconciliação de impacto DoS vs. potencial RCE, versões afetadas, mitigação, detecção) — sem primitivas de exploit |
ANALYZE.md | Versão em inglês do adendo de divulgação |
(Este arquivo é o README.md; os outros documentos do PoC também existem como RACE.md, VERIFY.md,
EXPLOIT.md, USAGE.md.)
Apenas Docker + internet no momento do build. A imagem compila o BIND 9.20.29 a partir do tarball
oficial do ISC (https://downloads.isc.org/isc/bind9/9.20.29/bind-9.20.29.tar.xz, SHA-256 fixado),
com --with-gssapi=yes, e instala gdb, o KDC do MIT Kerberos e os drivers do laboratório. Nenhum
BIND da distro, nenhuma imagem base pré-construída necessária.
A imagem contém uma identidade KDC descartável [email protected] (senha attacker,
realm EXAMPLE.TEST, KDC em 127.0.0.1:88 apenas no contêiner) — exclusivamente para este laboratório, não
para testes GSS-TSIG contra outros servidores; não retire o keytab do contêiner.
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) …
Esperado (trecho):
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
Frase de advertência: O ISC classifica a CVE-2026-94300 como remota, Alta, CVSS 8.1 (AC:H) com potencial execução de código. O que está estabelecido de forma pública/reproduzível é uma corrupção de memória sem credenciais, acionada por replay (use-after-free/double-free) no contexto GSS-TSIG compartilhado — classe de DoS a corrupção de heap. Um caminho para execução de código até agora só foi demonstrado sob premissas de modelo assistidas por depurador (ASLR desativado, endereços/conteúdo de objetos injetados); nenhum RCE remoto demonstrado existe.
Estabelecido: dado um vazamento, o RCE decorre no processo alvo. Não estabelecido: um ataque remoto sem vazamento e sem gdb — a primitiva de vazamento de informações e a etapa de recuperação alcançada estão faltando para isso. Este é um conjunto documentado de obstáculos, não uma prova de impossibilidade; o ISC trata a classe de execução de código como potencial. A base do código (bug de sincronização, dump destrutivo, o que o patch corrige e o que não corrige) é verificada em VERIFY.md contra o diff das duas árvores; como a corrida funciona tecnicamente está em RACE.md. Detalhes do exploit e evidências de código: EXPLOIT.md, execução e opções: USAGE.md. Divulgação pronta para publicação: ANALYZE.md.