
NGINX RCE エクスプロイト
CVE-2026-42945 のRCE Proof of Conceptです。これは2008年に導入されたNGINXの ngx_http_rewrite_module における深刻なヒープバッファオーバーフローです。このバグにより、rewrite および set ディレクティブを使用しているサーバーに対して、未認証のリモートコード実行が可能になります。
この脆弱性は、他の3件のメモリ破壊の問題(CVE-2026-42946、CVE-2026-40701、CVE-2026-42934)とともに、depthfirst のセキュリティ解析システムによって、NGINXソースのオンボーディングを1回クリックするだけで自動的に発見されました。
自分のコードでこのような問題を見つけたいですか? 同じシステムを https://depthfirst.com/open-defense で試せます。
NGINXのスクリプトエンジンは2パスのプロセスを使用します。最初に必要なバッファサイズを計算し、次にデータをコピーします。rewrite の置換文字列に ? が含まれると、メインエンジンに is_args フラグが設定されますが、長さ計算パスは新しくゼロ初期化されたサブエンジン上で実行されます。つまり:
is_args = 0 を参照するため、生のキャプチャ長を返します。is_args = 1 を参照するため、NGX_ESCAPE_ARGS を指定して ngx_escape_uri を呼び出し、エスケープ可能な各バイトを3バイトに展開します。このコピーにより、過小なヒープバッファが攻撃者制御のURIデータでオーバーフローします。悪用では、クロスリクエストのヒープ feng shui を使用して、隣接する ngx_pool_t の cleanup ポインタを破壊し(URIバイトはヌルバイトを含めないため、POSTボディ経由でスプレーします)、それを偽の ngx_pool_cleanup_s にリダイレクトして、プール破棄時に system() を呼び出します。
このバグの詳細は技術解説をご覧ください。
| 製品 | 影響を受けるバージョン | 修正版 |
|---|---|---|
| NGINX Open Source | 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
| NGINX Plus | R32 – R36 | R36 P4, R35 P2, R32 P6 |
K000161616: NGINX ngx_http_v3_module の脆弱性 — HTTP/3 QPACK は、単方向エンコーダストリームのプールからセッションの insert_buffer を割り当てます。そのストリームを閉じるとプールが解放される一方、セッションはダングリングポインタを保持するため、後続のエンコーダストリームが NGINX ワーカー内でヒープ use-after-free を引き起こします。
K000162097: NGINX map ディレクティブと正規表現マッチングの脆弱性 — map ディレクティブのキャプチャ変数を使った正規表現マッチングは、NGINX ワーカープロセスでヒープバッファオーバーフローを引き起こす可能性があります。
このバグは、ストリームスクリプトエンジンの2パスの複合値評価にあります。ssl_preread を使う脆弱な stream 構成では、攻撃者制御の TLS SNI が正規表現ベースの変数に渡されます。NGINX は最初に出力バッファの長さを計算し、次に出力をコピーします。map の正規表現は、これらのパスの間でグローバルキャプチャ状態を更新できます。長さパスは小さな値を考慮する一方、コピーパスは $1 のようなより大きな正規表現キャプチャを読み取るため、ワーカー内でヒープへの範囲外書き込みが発生します。
付属の CVE-2026-42533/ PoC はフルチェーンエクスプロイトです。ストリームの漏洩プリミティブを使用してヒープと libc のベースアドレスを取得し ASLR をバイパスし、HTTP リクエストボディを通じて偽の ngx_pool_cleanup_s レコードをスプレーし、その後オーバーフローを使用して隣接する NGINX プールの cleanup ポインタを破壊します。破損したプールが破棄されると、cleanup ディスパッチが libc の system() にリダイレクトされ、指定されたコマンドが実行されます。