
Автономный PoC и анализ для CVE-2026-94300 — use-after-free в GSS-TSIG в BIND 9.20.29, с моделью цепочки от утечки до выполнения кода, построенной с помощью отладчика.
Примечание: этот анализ и PoC были в значительной степени созданы с помощью ИИ («AI patchwork»). Каждое утверждение о коде, диффе и измерениях следует проверить по указанным источникам, прежде чем полагаться на него.
Самодостаточная папка PoC для цепочки эксплуатации CVE-2026-94300 (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-байтового слота не удался в реальном пути с исследованными здесь средствами (4,7 млн попыток, 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 | Образ жертвы: BIND 9.20.29 из архива ISC + gdb + KDC + драйверы лаборатории |
etc/ | krb5.conf, kdc.conf, named.conf, зона (копируются в /etc образом) |
host/exploit.py | Хост-эксплойт: читает docker logs, проверяет, воспроизводит по UDP, проверяет маркер |
lab/rce_victim.sh | Драйвер внутри контейнера: named под gdb, захват без отправки, утечка, ожидание |
lab/rce_model.py | Модель gdb: точки останова, блок утечки, взведение, наблюдение за диспетчеризацией |
lab/rce_leak.py | Этап утечки: адреса + wire_b64 → stdout/файл |
lab/rce_exploit.py | Этап эксплойта в контейнере: построение поддельного объекта из утечки, повторный захват, диспетчеризация |
lab/rce_shim.c | Шим фиксированной страницы: поддельная таблица, поддельный шаблон 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/зоны, конфигурация 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 vs. потенциальный RCE, затронутые версии, смягчение, обнаружение) — без примитивов эксплойта |
ANALYZE.md | Английская версия дополнения к раскрытию |
(Этот файл — README.md; другие документы PoC также существуют как RACE.md, VERIFY.md,
EXPLOIT.md, USAGE.md.)
Только Docker + интернет на этапе сборки. Образ собирает BIND 9.20.29 самостоятельно из официального
архива ISC (https://downloads.isc.org/isc/bind9/9.20.29/bind-9.20.29.tar.xz, SHA-256 закреплён),
с --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 как удалённую, High, CVSS 8.1 (AC:H) с потенциальным выполнением кода. Публично/воспроизводимо установлено повреждение памяти без учётных данных, запускаемое повторным воспроизведением (use-after-free/double-free) в общем контексте GSS-TSIG — класс от DoS до повреждения кучи. Путь к выполнению кода до сих пор показан только при допущениях модели с поддержкой отладчика (ASLR отключён, адреса/содержимое объектов внедрены); продемонстрированного удалённого RCE не существует.
Установлено: при наличии утечки RCE следует в целевом процессе. Не установлено: удалённая атака без утечки и без gdb — для этого отсутствуют примитив утечки информации и достигнутый шаг возврата памяти. Это документированный набор препятствий, а не доказательство невозможности; ISC относит класс выполнения кода к потенциальным. Кодовая база (ошибка синхронизации, деструктивный дамп, что исправляет патч и что нет) проверена в VERIFY.md по diff двух деревьев; как технически работает гонка — в RACE.md. Детали эксплойта и доказательства кода: EXPLOIT.md, выполнение и параметры: USAGE.md. Готовое к публикации раскрытие: ANALYZE.md.