needhelp
← ブログに戻る

NGINX Rift(CVE-2026-42945):リライトモジュールに潜む 18 年前のヒープオーバーフロー

著者 xingwangzhe
NGINX
CVE
セキュリティ
RCE
ヒープオーバーフロー
Webサーバー

NGINX Rift(CVE-2026-42945, CVSS 9.2):NGINX のリライトモジュールにおける critical なヒープバッファオーバーフロー。depthfirst の AI 分析システムによって自律的に発見された。2008 年に導入され、18 年間にわたる NGINX リリースに影響。認証されていない攻撃者が 1 つの細工された HTTP リクエストでリモートコード実行を達成できる。


明白な場所に隠されていた脆弱性

2026 年 5 月 13 日、F5 と depthfirst は共同で CVE-2026-42945 を開示した——NGINX の ngx_http_rewrite_module における critical なヒープバッファオーバーフローである。この脆弱性は 2008 年 からコードベースに存在し、NGINX 0.6.27 で導入され、その後 1.30.0 までのすべてのバージョンに影響を与えていた。

この発見が特に注目に値するのは、その発見方法にある。人間の研究者が手動でコードを監査したのではなく、depthfirst の自律型脆弱性分析システム によって発見されたのだ。AI システムが NGINX のソースコードを分析し、6 時間以内 に、人間の目を 18 年間逃れてきたヒープオーバーフロー問題をフラグ付けした。

指標
CVECVE-2026-42945
CVSS v4.09.2(Critical)
発見者depthfirst(自律型 AI 分析)
導入時期2008 年(NGINX 0.6.27)
潜伏期間18 年
脆弱性タイプヒープバッファオーバーフロー(2パス長不一致)
認証要件不要
影響リモートコード実行(RCE)またはワーカークラッシュ(DoS)
修正バージョンNGINX 1.31.0 / 1.30.1

影響を受けるバージョン

この脆弱性は、ほぼすべての NGINX 製品ラインに影響する:

製品影響を受けるバージョン
NGINX オープンソース0.6.27 から 1.30.0 まで
NGINX PlusR32 から R36
NGINX Instance Manager2.16.0 から 2.21.1
F5 NGINX App Protect WAF4.9.0–4.16.0, 5.1.0–5.8.0
NGINX Ingress Controller3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1
NGINX Gateway Fabric1.3.0–1.6.2, 2.0.0–2.5.1

NGINX が世界の約 3 分の 1 のウェブサイト を支えていることを考えると、この脆弱性の爆発半径は計り知れない。


技術的な深掘り

2パス設計

このバグを理解するには、NGINX のスクリプトエンジンを理解する必要がある。NGINX が rewrite または set ディレクティブを評価するとき、2 つのパス で動作する:

  1. 長さ計算パスngx_http_script_len_code):最終出力を保持するために必要なバッファサイズを計算
  2. コピーパスngx_http_script_run / ngx_http_script_copy_code):そのサイズのバッファを割り当て、実際のデータを書き込む

契約はシンプルだ:パス 1 が割り当てるべきバイト数を正確に伝え、パス 2 がその正確なバイト数を書き込む。両者が一致しない場合——ヒープオーバーフローが発生する。

根本原因:孤立した is_args フラグ

脆弱性は src/http/ngx_http_script.c に存在する。rewrite ディレクティブの置換文字列に 疑問符?)が含まれていると、関数 ngx_http_script_start_args_code がスクリプトエンジンにフラグを設定する:

e->is_args = 1;

このフラグは、後続の URI コンポーネントをクエリ引数として扱い、URI エスケープ する必要があることを示す(例:+%2B&%26)。

問題は:このフラグが決してリセットされない ことだ。リクエスト処理の残りの間、メインスクリプトエンジン(e)に設定されたままになる。

不一致

後続の set ディレクティブが正規表現キャプチャグループ(例:$1)を参照すると、スクリプトエンジンがそれを評価する。長さ計算パス では、ngx_http_script_complex_value_code新しくゼロクリアされたサブエンジンle)を作成する:

ngx_http_script_len_code_ctx_t  le;
ngx_memzero(&le, sizeof(ngx_http_script_len_code_ctx_t));

le.iple.is_args が両方ともゼロであるため、長さ計算関数 ngx_http_script_copy_capture_len_codeelse ブランチ を取る——エスケープされていない生のキャプチャ長を返す。

コピーパス では、コードは メインエンジンe)で実行され、e->is_args は依然として 1 である。コピー関数 ngx_http_script_copy_capture_code異なるブランチ に入る:

if (e->is_args) {
    // URI をエスケープ:+ % & を 1 バイトから 3 バイトに拡張
    n = ngx_escape_uri(NULL, src, len, NGX_ESCAPE_ARGS);
    // ...エスケープ版を割り当てて書き込む
}

攻撃者が制御する URI 内のエスケープ可能な各文字(+%&)が 1 バイトから 3 バイト に拡張される。バッファは生の(エスケープされていない)長さでサイジングされていた——書き込みが割り当てを超える

// 長さ計算パスの測定:raw_len バイト
// コピーパスの書き込み:raw_len + 2*N バイト(N = エスケープ可能文字数)
//                       ↑↑↑  ヒープオーバーフロー

これは古典的な 2パス契約違反 であり、is_args 状態がまったく無関係の rewrite ディレクティブによって設定され、決してクリーンアップされなかったために可能になった。

悪用

depthfirst の研究者は、ASLR を無効にした状態で NGINX に対する 未認証 RCE を実証する実用的な概念実証を開発した。悪用を実用的にする主要な特性:

特性詳細
オーバーフローサイズ攻撃者が完全に制御可能(URI 内の +&% の数)
オーバーフローデータ攻撃者が制御可能(エスケープされた URI コンテンツ)
再現性決定論的——同じリクエストは常に同じようにオーバーフローする
リトライ予算無限——クラッシュしたワーカーは同じヒープレイアウトで再生成される
認証不要——パブリックインターネットから到達可能

無限のリトライ予算は、ASLR バイパスにとって特に重要である。ASLR に対する現代的な悪用は、通常、情報漏洩またはブルートフォースを必要とする。NGINX はクラッシュのたびに同一のヒープレイアウトで代替ワーカーを生成するため、攻撃者は コストなしで無制限の試行 を行うことができる。

研究者は理論的な手法を説明している:複数のリクエストにわたってポインタバイトを段階的に上書きすることで、攻撃者は制御されたペイロードに実行フローをリダイレクトし、明示的な情報漏洩ステップなしで ASLR を無効化できる。


トリガー条件:影響を受けているか?

この脆弱性は、NGINX 設定が特定のパターンを含む場合にのみ到達可能である:

# 脆弱なパターン:
# 1. 置換に ? があり、名前なしキャプチャグループを使用する rewrite
# 2. 同じスコープ内で別の rewrite、if、または set が続く

rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

/profile.php?id=$1&tab=$2?is_args = 1 を設定する。後続のディレクティブが評価するときに、名前なしキャプチャ $1$2 が脆弱なコードパスをトリガーする。

設定を確認する

grep -rn 'rewrite.*\?.*\$[0-9]' /etc/nginx/

一致するものがあれば、設定は影響を受けている。


緩和策

即時:アップグレード

バージョン対応
NGINX オープンソース1.31.0 または 1.30.1 にアップグレード
NGINX Plus R36R36 P4 を適用
NGINX Plus R32R32 P6 を適用

回避策:名前付きキャプチャグループ

すぐにアップグレードできない場合は、影響を受けるすべての rewrite ディレクティブで 名前なしキャプチャ名前付きキャプチャ に置き換える:

# 脆弱——置換に ? がある名前なしキャプチャ
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

# 緩和——名前付きキャプチャが脆弱なコードパスを回避
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

名前付きキャプチャ((?<name>...))は脆弱なエスケープロジックを 通過しない。なぜなら、ngx_http_script_copy_capture_code 関数は名前なしキャプチャにのみ URI エスケープを適用するからだ。この設定変更により、バイナリアップグレードなしで攻撃面が除去される。

修正の確認

# バージョンを確認
nginx -v

# アップグレード後、確認:1.31.0 または 1.30.1+ であるべき
nginx -v 2>&1 | grep -E '1\.31\.0|1\.30\.[1-9]'

タイムライン

日付イベント
2008 年NGINX 0.6.27 で脆弱性が導入される(リライトモジュール初期化コミット)
2026 年 4 月depthfirst 自律システムが NGINX ソースコードをスキャン、6 時間でヒープオーバーフローをフラグ付け
2026-04-24F5 が問題を確認し、開示を調整
2026-05-13F5 が修正を含む NGINX 1.31.0 / 1.30.1 をリリース;CVE-2026-42945 公開
2026-05-14本記事公開

より広い意味:AI が発見した脆弱性

CVE-2026-42945 が注目に値するのは、その深刻さだけでなく、発見方法 にもある。自律型 AI システムが、18 年にわたって数千人のエンジニア、セキュリティ研究者、オープンソースコントリビューターによって監査されてきたコードベースでバグを発見した——たった 6 時間で。

これは 2026 年に加速しているパターンに従う:

脆弱性発見者発見時間
Copy Fail(Linux カーネル LPE)Xint Code(AI)~1 時間
Dirty Frag(Linux カーネル LPE)人間(Hyunwoo Kim)手動監査
CVE-2026-42945(NGINX Rift)depthfirst(自律型 AI)6 時間
CVE-2026-42946(NGINX 過剰読み取り)depthfirst(自律型 AI)同じスキャン

決意のある AI システムが見つけられるものと、人間のレビュアーが歴史的に捕捉してきたものとのギャップは急速に拡大している。クリティカルインフラストラクチャのメンテナーにとって、これは意味する:

  1. 依存関係にはさらに未発見のバグがあると想定する——これまでに見つかったものは、現在の AI ツールが捕捉できるものにすぎない
  2. 攻撃面を最小化する——未使用のモジュールを削除し、不要な機能を無効にし、最小機能の原則を使用する
  3. 多層防御——コンポーネントが侵害されても、他のレイヤーが爆発半径を制限するべき

NGINX 自体は興味深いケースだ:クリーンなコードベースと強力なセキュリティトラックレコードで知られている。それでも、18 年間の critical な RCE が明白な場所に隠れていた。NGINX がこの種のバグから安全でないなら、C のコードベースはどれも安全ではない。


結論

CVE-2026-42945(NGINX Rift)は、インターネット上で最も広く展開されているソフトウェアプロジェクトの 1 つにおける critical なヒープオーバーフローである。認証は不要で、パブリックインターネットからトリガー可能で、攻撃者に NGINX ワーカープロセスでの完全なコード実行を与える。

NGINX を実行している場合、影響を受けていると想定する——設定に脆弱な rewrite パターンが含まれていないことを確認したか、1.31.0 / 1.30.1 にアップグレードしていない限り。

このバグの 18 年にわたる寿命は、厳粛なリマインダーである:私たちのインフラは、最新のツールによって包括的に監査されたことのないコードによって支えられている。脆弱性発見の AI 時代はまだ始まったばかりであり、私たちはこのような暴露がより少なくなるのではなく、より多くなることを期待すべきである。


参考文献


情報図

NGINX Rift ヒープオーバーフロー図

図 1:NGINX Rift——2パスバッファ長不一致がどのようにヒープオーバーフローを引き起こすか

このページをシェア