Nginxに18年間潜伏した脆弱性CVE-2026-42945:仕組み・PoC・修正方法を徹底解説

🚨 Nginxに18年間潜伏した高危険度脆弱性CVE-2026-42945:仕組み、PoC、修正方法
2026年5月13日、セキュリティ調査機関depthfirstがF5と共同で、NGINX史上最悪クラスの高危険度脆弱性を公表した——CVE-2026-42945:
- CVSS v4.0 スコア 9.2:高危険度脆弱性に分類
- ヒープバッファオーバーフロー:リモートコード実行(RCE)につながる可能性
- 18年間の潜伏:2008年にコードベースへ書き込まれて以来
- 世界975万サイトに影響:中国では254万超のWebサイトが影響を受ける
- PoCは公開済み:奇安信が再現に成功
これはNGINXコアモジュールに存在した歴史的な脆弱性で、攻撃者は細工したHTTPリクエストを1つ送るだけでサーバーをリモートで乗っ取ることができる。
🔍 脆弱性の概要
基本情報
| 脆弱性の属性 | 詳細 |
|---|---|
| 脆弱性ID | CVE-2026-42945 |
| CVSSスコア | v4.0: 9.2 | v3.1: 8.1 |
| 脆弱性タイプ | ヒープバッファオーバーフロー(Heap-based Buffer Overflow) |
| 脅威の種類 | リモートコード実行(RCE)、サービス拒否(DoS) |
| 悪用条件 | 認証不要、HTTPリクエストを構築するだけでよい |
| 影響を受けるコンポーネント | ngx_http_rewrite_module(NGINXコア内蔵モジュール) |
| 発見機関 | depthfirst(自動化システムが6時間以内に発見) |
影響範囲
- 世界の975万サイトが影響を受ける
- 中国の254万Webサイトが影響を受ける
- NGINXは世界の約1/3のWebサイトを支えており、影響範囲は極めて大きい
- コードは2008年に書き込まれ、潜伏期間は18年
⚠️ トリガー条件
3つの条件がすべて同時に成立する必要がある
脆弱性の発火には設定が特定の条件の組み合わせを満たす必要がある:
| 条件 | 説明 | 例 |
|---|---|---|
| 1. 名前なしPCREキャプチャ | rewriteディレクティブが名前なしキャプチャグループを使用 | $1, $2, $3… |
| 2. 置換文字列に疑問符を含む | 置換文字列に ? 文字が含まれる | /profile.php?id=$1&tab=$2 |
| 3. 後続に rewrite/if/set が続く | rewriteディレクティブの直後に他のディレクティブが続く | rewrite … last; if (…) { … } |
脆弱な設定の例
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
この設定は3つの条件をすべて満たしている:名前なしキャプチャ $1/$2、置換文字列に ? を含む、後続に if ディレクティブが続く。
🔬 脆弱性の仕組み
2段階処理における状態の不整合
NGINXスクリプトエンジンは2段階処理を使用する:
- 第1段階:必要なバッファサイズを計算する
- 第2段階:データをバッファへコピーする
脆弱性の核心はis_args フラグの管理ミスにある:
| 段階 | is_args の状態 | 処理ロジック | 結果 |
|---|---|---|---|
| 長さ計算段階 | is_args = 0 | 元のキャプチャ長を返す | バッファサイズを過小評価 |
| データコピー段階 | is_args = 1 | ngx_escape_uri を呼び出し、各バイトが3バイトに拡張される | ヒープバッファオーバーフロー |
具体的な流れ
- rewriteディレクティブが名前なしキャプチャ $1/$2 を含む
- 置換文字列が ? を含み、is_args = 1 となる
- 長さ計算段階:新しく初期化されたサブエンジンを使用し、is_args = 0
- 元の長さを返す:過小なヒープバッファが確保される
- データコピー段階:メインエンジンを使用し、is_args = 1
- ngx_escape_uri を呼び出す:バイトを拡張し、バッファを溢れさせる
- 攻撃者が制御できるURIデータがオーバーフロー領域に書き込まれる
悪用手法
リクエストをまたぐヒープFeng Shui(Heap Feng Shui):
- POSTリクエストボディでヒープメモリをスプレーする(URIにはnullバイトを含められないため)
- オーバーフローデータが隣接する ngx_pool_t の cleanup ポインタを破壊する
- ngx_pool_cleanup_s を偽装し、system() を指させる
- poolが破棄される際にsystem() の呼び出しが発火
- RCEが実現する
ASLRの影響
- ASLR有効時:Workerプロセスのクラッシュ(DoS)にとどまる
- ASLR無効時:リモートコード実行(RCE)が可能になる
📊 影響を受けるバージョン
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 |
その他の影響を受けるコンポーネント
- NGINX Instance Manager:2.16.0 – 2.21.1
- NGINX App Protect WAF:4.9.0 – 5.8.0
- NGINX Ingress Controller:3.5.0 – 5.4.1
- NGINX Gateway Fabric:1.3.0 – 2.5.1
- F5 DoS for NGINX:4.8.0
🔥 PoCの状況
PoCは公開済み
- GitHubリポジトリ:https://github.com/DepthFirstDisclosures/Nginx-Rift
- 奇安信が再現済み:脅威インテリジェンスセンターのセキュリティ研究者が再現に成功
- 技術詳細は公開済み:depthfirstが技術分析を公開
- 実世界での悪用(in-the-wild):現時点では確認されていない
PoCの使用方法
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ 修正方法
方法1:バージョンをアップグレード
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
方法2:設定を変更(緩和策)
「名前なしキャプチャグループ」を名前付きキャプチャグループに置き換える:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
名前付きキャプチャグループであればこの脆弱性は引き起こされない。
方法3:設定を確認
脆弱な設定が存在するか確認する:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 発見の経緯
自動化システムによる発見
depthfirstのセキュリティ分析システム:
- 6時間以内に5件の問題を発見
- 4件がNGINXに確認された
- CVE-2026-42945はその中で最も深刻な脆弱性
- 2008年にまで遡ることができ、ほぼすべての標準ビルドに存在していた
その他の関連脆弱性
- CVE-2026-42946:メモリ破壊の問題
- CVE-2026-40701:メモリ破壊の問題
- CVE-2026-42934:メモリ破壊の問題
📝 まとめ
CVE-2026-42945はNGINX史上の高危険度脆弱性である:
- 18年間の潜伏:2008年にコードベースへ書き込まれて以来
- CVSS 9.2:ヒープバッファオーバーフローで、RCEにつながる可能性
- トリガー条件:rewriteディレクティブが名前なしキャプチャを使用 + 置換文字列に ? を含む + 後続に他のディレクティブが続く
- 影響範囲:世界975万サイト、中国では254万Webサイト
- PoCは公開済み:GitHubリポジトリ + 奇安信が再現
- 修正方法:バージョンのアップグレード、または名前付きキャプチャグループの使用
18年間潜伏していた脆弱性が顕在化したため、できるだけ早くアップグレードまたは設定変更を行うことを推奨する。
公式アナウンス:https://my.f5.com/manage/s/article/K000161019
PoCリポジトリ:https://github.com/DepthFirstDisclosures/Nginx-Rift