
PoC autocontenido y análisis para CVE-2026-94300, un use-after-free de GSS-TSIG en BIND 9.20.29, con un modelo asistido por depurador de la cadena de fuga a ejecución de código.
Nota: Este análisis y PoC se produjeron en gran medida con asistencia de IA ("AI patchwork"). Cada afirmación sobre código, diff y mediciones debe verificarse contra las fuentes citadas antes de confiar en ella.
Carpeta PoC autocontenida para la cadena de explotación de CVE-2026-94300 (BIND 9.20.29 con GSS-TSIG, krb5 1.20.1, jemalloc 5.3.0).
Lo que se demuestra aquí: un conjunto de direcciones filtrado (aquí desde gdb) basta para construir ejecución de código en
el proceso named a partir de las primitivas medidas. El exploit consume la fuga de
docker logs; no contiene literales de direcciones.
Lo que es explícitamente un modelo aquí (y así se declara en el informe):
| Suposición | Motivo |
|---|---|
| Fuga desde gdb | El CVE no tiene primitiva de fuga de información; una fuga real tendría que provenir de otro bug |
ASLR desactivado (setarch -R) | sin una fuga no hay direcciones de heap/código |
| Control del contenido del objeto inyectado vía gdb | la recuperación del slot de 8 bytes liberado no tuvo éxito en la ruta real con los medios examinados aquí (4,7M intentos, 0 aciertos) — un obstáculo documentado, no una prueba de imposibilidad |
No hay RCE remoto demostrado ni persistencia. El comando se proporciona mediante --cmd en el exploit: host/exploit.py lo entrega a través del canal de control de Docker (docker exec, la misma autoridad que el operador ya posee) hacia el contenedor; el exploit en sí
envía solo las direcciones filtradas y el paquete capturado. El payload además escribe la línea RCE-PROOF (para verificación) y termina 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
| Ruta | Propósito |
|---|---|
docker/Dockerfile | Imagen víctima: BIND 9.20.29 del tarball de ISC + gdb + KDC + drivers del laboratorio |
etc/ | krb5.conf, kdc.conf, named.conf, zona (copiados a /etc por la imagen) |
host/exploit.py | Exploit del host: lee docker logs, valida, reproduce por UDP, comprueba el marcador |
lab/rce_victim.sh | Driver dentro del contenedor: named bajo gdb, captura sin envío, fuga, espera |
lab/rce_model.py | Modelo gdb: puntos de interrupción, bloque de fuga, armado, observación del despacho |
lab/rce_leak.py | Etapa de fuga: direcciones + wire_b64 → stdout/archivo |
lab/rce_exploit.py | Etapa de exploit en el contenedor: construye el objeto falso a partir de la fuga, reclama, despacha |
lab/rce_shim.c | Shim de página fija: tabla falsa, plantilla falsa de dns_db_t, payload |
lab/replay-lab.py | Captura TKEY (--no-send) |
lab/gss_context_lab.py | Auxiliar de contexto GSS para la captura |
lab/start.sh, lab/named.replay.conf | Arranque de KDC/keytab/zona, configuración de named |
RACE.md | Explicación de la carrera sobre el contexto GSS-TSIG compartido: compartición, accesos, disparador, mediciones, alcance |
VERIFY.md | Verificación de las tres afirmaciones contra el diff del código fuente 9.20.29 → 9.20.30 (bloqueo de GSS-TSIG, volcado destructivo del keyring, alcance del RCE) |
EXPLOIT.md | Descripción del exploit con evidencia en el código y Mermaid |
USAGE.md | Compilación, ejecución, salidas esperadas, resolución de problemas |
ANAYLSE.md | Adenda de divulgación lista para publicación (conciliación del impacto DoS vs. potencial RCE, versiones afectadas, mitigación, detección) — sin primitivas de exploit |
ANALYZE.md | Versión en inglés de la adenda de divulgación |
(Este archivo es README.md; los demás documentos del PoC también existen como RACE.md, VERIFY.md,
EXPLOIT.md, USAGE.md.)
Solo Docker + internet en el momento de la compilación. La imagen compila BIND 9.20.29 por sí misma a partir del tarball
oficial de ISC (https://downloads.isc.org/isc/bind9/9.20.29/bind-9.20.29.tar.xz, SHA-256 fijado),
con --with-gssapi=yes, e instala gdb, el KDC de MIT Kerberos y los drivers del laboratorio. No se necesita
BIND de la distro ni una imagen base precompilada.
La imagen contiene una identidad KDC desechable [email protected] (contraseña attacker,
realm EXAMPLE.TEST, KDC en 127.0.0.1:88 solo dentro del contenedor) — exclusivamente para este laboratorio, no
para pruebas de GSS-TSIG contra otros servidores; no extraiga el keytab del contenedor.
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 (extracto):
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 advertencia: ISC clasifica CVE-2026-94300 como remoto, Alto, CVSS 8.1 (AC:H) con potencial ejecución de código. Lo que está establecido de forma pública/reproducible es una corrupción de memoria sin credenciales y desencadenada por repetición (use-after-free/double-free) sobre el contexto GSS-TSIG compartido — clase DoS a corrupción de heap. Una ruta hacia la ejecución de código solo se ha mostrado hasta ahora bajo supuestos de modelo asistidos por depurador (ASLR desactivado, direcciones/contenidos de objetos inyectados); no existe un RCE remoto demostrado.
Establecido: dado un leak, el RCE se sigue en el proceso objetivo. No establecido: un ataque remoto sin un leak y sin gdb — la primitiva de fuga de información y el paso de reclamación logrado faltan para ello. Este es un conjunto documentado de obstáculos, no una prueba de imposibilidad; ISC clasifica la clase de ejecución de código como potencial. La base del código (bug de sincronización, volcado destructivo, qué corrige el parche y qué no) se verifica en VERIFY.md contra el diff de los dos árboles; cómo funciona técnicamente la carrera está en RACE.md. Detalles del exploit y evidencia del código: EXPLOIT.md, ejecución y opciones: USAGE.md. Divulgación lista para publicación: ANALYZE.md.