
CVE-2026-94300(BIND 9.20.29의 GSS-TSIG use-after-free)에 대한 자체 포함형 PoC 및 분석으로, 디버거 보조를 통한 정보 유출에서 코드 실행으로 이어지는 체인 모델을 포함합니다.
참고: 이 분석과 PoC는 상당 부분 AI 지원("AI patchwork")으로 작성되었습니다. 모든 코드, diff, 측정 주장은 의존하기 전에 인용된 출처와 대조하여 검증해야 합니다.
CVE-2026-94300(GSS-TSIG가 적용된 BIND 9.20.29, krb5 1.20.1, jemalloc 5.3.0)의 익스플로잇 체인을 위한 자체 포함 PoC 폴더입니다.
여기서 입증된 것: 유출된 주소 집합(여기서는 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 모델: 브레이크포인트, 유출 블록, 무장(arming), 디스패치 관찰 |
lab/rce_leak.py | 유출 단계: 주소 + wire_b64 → stdout/파일 |
lab/rce_exploit.py | 컨테이너 내 익스플로잇 단계: 유출로부터 가짜 객체를 구성하고, 재점유(reclaim), 디스패치 |
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 | 소스 diff 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을 원격, High, CVSS 8.1(AC:H)로 평가하며 잠재적 코드 실행 가능성이 있다고 본다. 공개적으로/재현 가능하게 입증된 것은 공유 GSS-TSIG 컨텍스트에서의 자격 증명 없는, 재생 트리거 메모리 손상(use-after-free/double-free)으로, DoS에서 힙 손상에 이르는 부류이다. 코드 실행으로 이어지는 경로는 지금까지 디버거 보조 모델 가정(ASLR 비활성화, 주소/객체 내용 주입) 하에서만 제시되었으며, 입증된 원격 RCE는 존재하지 않는다.
입증된 것: 대상 프로세스에서 누출이 주어지면 RCE가 뒤따른다. 입증되지 않은 것: 누출도 없고 gdb도 없는 원격 공격 — 이를 위해서는 정보 누출 프리미티브와 달성된 재할당 단계가 빠져 있다. 이는 문서화된 장애물 집합이며, 불가능성 증명이 아니다. ISC는 코드 실행 부류를 잠재적 위험으로 다룬다. 코드 기반(동기화 버그, 파괴적 덤프, 패치가 고치는 것과 고치지 않는 것)은 두 트리의 diff에 대해 VERIFY.md에서 검증되었고, 레이스가 기술적으로 어떻게 작동하는지는 RACE.md에 있다. 익스플로잇 세부 사항과 코드 증거: EXPLOIT.md, 실행 및 옵션: USAGE.md. 공개 준비 완료된 공개: ANALYZE.md.