2026年5月14日、Webサーバシェア世界約34%を占めるNGINXにCVSS 9.2(Critical)のヒープバッファオーバーフロー脆弱性が公表された。CVE-2026-42945、通称「NGINX Rift」は2008年頃に導入されたngx_http_rewrite_moduleのバグに起因し、18年間にわたってコードベースに潜伏し続けた。3日後の5月17日にはPoC由来のアクティブ攻撃が実環境で確認されており、未パッチのNGINX運用者には即時対応が求められる。
セキュリティ脆弱性の体系的な防御アプローチについてはサプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリストをご覧ください。
- ・影響範囲: NGINX 0.6.27〜1.30.0 / Plus R32〜R36・Ingress Controller・App Protect WAFに影響。修正版は1.30.1 / 1.31.0。
- ・攻撃内容: ngx_http_rewrite_moduleの2パス処理バグでヒープを溢れさせ、認証不要でDoS/RCEを実行。5月17日からPoC由来の攻撃進行中。
- ・即効緩和: 設定ファイルの無名キャプチャ($1)をnamed capture(${name})に書き換え + nginx -s reloadで再起動なしに緩和可能。
NGINX Riftとは:CVE-2026-42945の全体像
NGINX Riftはセキュリティ研究チーム「depthfirst」が2026年4月18日に自律スキャニングにより発見し、4月21日にF5/NGINXへ責任ある開示(responsible disclosure)を行った脆弱性だ。公表から5月13〜14日のパッチリリースまでわずか23日という異例の速さで対応が進んだ一方、翌17日にはPoC(概念実証コード)が公開されアクティブ攻撃が確認された。
NGINXは世界の約34%のWebサーバで稼働しており、この影響範囲はApacheやCaddy、Iisの比ではない。さらにNGINXは多くのKubernetesクラスタのIngress Controllerとして、またF5のApp Protect WAFのエンジンとして組み込まれているため、一台のNGINXバイナリを修正するだけでなく、複数の製品スタックを個別に更新する必要がある。
CVSSスコアはv4.0で9.2(Critical)、v3.1では8.1(High)と評価されている。v4.0とv3.1でスコアが異なるのは、RCEの実現可能性に関する評価の違いによるもの(後述)。
根本原因:ngx_http_rewrite_moduleの2パス処理バグ
NGINX Riftの技術的本質はngx_http_script.c内の状態フラグ汚染だ。NGINXのrewriteエンジンはリクエスト処理を2つのフェーズで行う。
- 計算フェーズ(length pass): 置換後URLのバッファサイズを計算してメモリを確保
- コピーフェーズ(copy pass): 実際のURLデータをバッファに書き込む
問題が起きるのは、rewriteディレクティブの置換文字列に?(クエリ文字列区切り)が含まれる場合だ。この時ngx_http_script_start_args_code関数がe->is_args = 1フラグを立てる。このフラグは計算フェーズでは正しくリセットされるが、コピーフェーズではそのまま引き継がれてしまう。
結果としてngx_escape_uri関数は計算フェーズで算出したバッファサイズよりも大きなデータを書き込もうとし、ヒープバッファオーバーフローが発生する。さらに致命的なのは、オーバーフローで書き込まれるバイト列が攻撃者の送ったURIから直接導出される点だ。これは「攻撃者がメモリ破壊の内容を制御できる」ことを意味し、単純なサービス妨害を超えたコード実行への道を開く。
この条件が揃うのは以下の3つが同時に成立する場合だ:
- 無名PCREキャプチャ(
$1、$2など)を含むrewriteルール - 置換文字列に
?を含む(クエリ文字列を付加する形式) - 同じlocation/server内で別のrewrite・if・setディレクティブが後続する
これはAPIゲートウェイやリバースプロキシ設定で頻繁に見られるパターンであり、多数の本番環境が潜在的に影響を受けている。
攻撃手法の詳細:ヒープfeng shuiによるRCE
DoS(ワーカープロセスのクラッシュと再起動)は「trivial and reliable(自明かつ安定的)」とAlmaLinuxのアセスメントで評価されており、特別な技術なしに実現できる。一方、完全なRCEは6ステップのヒープfeng shuiテクニックを用いる高度な攻撃だ。
- Step 1 — 接続確立: HTTPリクエストのヘッダを途中で送り、NGINXワーカーにリクエストプールを確保させる
- Step 2 — 被害コネクション配置: 別のコネクションで隣接するメモリプール構造体を確保させる(ヒープ隣接配置)
- Step 3 — オーバーフロートリガー: Step 1のヘッダを完成させてリクエストを完了させ、被害プールのcleanupハンドラポインタを上書きする
- Step 4 — ヒープスプレー: POSTボディで予測可能なメモリ位置に偽のcleanup構造体(関数ポインタ付き)を配置する
- Step 5 — アドレス総当たり: URIセーフなバイト列のみで構成されるアドレスを総当たりで探す
- Step 6 — プール解放: プールのcleanupフェーズで書き換えられたハンドラが実行され、任意コード実行を達成
重要な注記がある。公開されているPoCはRCEの実証にASLR(Address Space Layout Randomization)の無効化を必要とした。現代のLinuxディストリビューションではASLRがデフォルトで有効になっており、通常構成のサーバではRCEの難易度は大幅に上がる。ただしコンテナ環境や組み込み機器ではASLRが無効または弱化されているケースがある点に注意が必要だ。実際、Kubernetes上でのPodはホストのASLR設定に依存する。
タイムライン:18年の潜伏から3日間のアクティブ攻撃へ
バグ導入 (NGINX 0.6.27) 2026-04-18 : depthfirstが自律スキャニングで発見 2026-04-21 : F5/NGINXへ責任ある開示 2026-05-13 : NGINX 1.30.1 / 1.31.0
パッチリリース 2026-05-14 : CVE公開・PoCコード公開 2026-05-17 : アクティブ攻撃確認
VulnCheck Canariesが検出 2026-05-20 : 世界規模での攻撃継続中
特筆すべきは発見から公開までの速さだ。通常のCVEサイクルは90日程度だが、今回は23日で対応が完了した。これはF5/NGINXの迅速な対応と、depthfirstによる責任ある開示の成功例と言える。ただしPoCの即日公開がアクティブ攻撃を加速させた点は議論の余地がある。
また、18年間このバグが発見されなかった背景として、脆弱性を引き起こす条件(無名キャプチャ + ? + 後続ディレクティブ)が比較的ニッチなパターンであり、かつ通常の動作テストでは問題が顕在化しにくいことが挙げられる。depthfirstが自律スキャニングツールによって発見できたのは、人間のセキュリティ研究者が見落としやすいこのようなコーナーケースを系統的に探索できたからだ。
影響範囲:製品別バージョン対応表
| 製品 | 影響を受けるバージョン | 修正版 | 優先度 |
|---|---|---|---|
| NGINX Open Source(stable) | 0.6.27 〜 1.30.0 | 1.30.1 | 緊急 |
| NGINX Open Source(mainline) | 0.6.27 〜 1.30.0 | 1.31.0 | 緊急 |
| NGINX Plus | R32 〜 R36 | R32 P6 / R36 P4 | 緊急 |
| NGINX Instance Manager | 2.16.0 〜 2.21.1 | 2.21.2以降 | 高 |
| NGINX App Protect WAF | 4.9.0 〜 5.8.0 | 5.9.0以降 | 緊急 |
| NGINX Gateway Fabric | 1.3.0 〜 2.5.1 | 2.5.2以降 | 高 |
| NGINX Ingress Controller | 3.5.0 〜 5.4.1 | 5.4.2以降 | 緊急 |
| F5 WAF for NGINX | 5.9.0 〜 5.12.1 | 5.12.2以降 | 高 |
- ・Kubernetes Ingress Controller: クラスタ内の全トラフィックを処理するため、侵害された場合の影響が最大級
- ・NGINX App Protect WAF: WAF自体が脆弱というアイロニー。WAFをバイパスしつつRCEを狙える
- ・APIゲートウェイ: rewrite + set の組み合わせが多用されており、脆弱パターンの密度が高い
- ・コンテナ環境(ASLRが弱化): DoSに留まらず本格的なRCEリスクが増大
⚡ 対応確認の手順
「自分の環境が影響を受けるか」「すでに攻撃を受けていないか」を上から順に切り分ける。下記のStep 1〜4を順に実行すれば、パッチ適用までの判断が一本道になる。攻撃確認手順を体系立てて回す考え方は、MariaDB Galera RCE脆弱性 CVE-2026-49261(CVSS 10.0)|影響確認とパッチ手順とも共通する。
Step 1: バージョン確認
まず稼働中のNGINXが修正版(1.30.1 / 1.31.0以降)かを確認する。-V(大文字)はビルドオプションまで出力するため、どのモジュールが組み込まれているかも同時に把握できる。
# バージョンとビルドオプションを確認
nginx -v # 例: nginx version: nginx/1.28.0 → 脆弱
nginx -V 2>&1 | tr ' ' '\n' | grep -i 'http_rewrite\|with-http'
# パッケージ側のバージョンも突き合わせる
dpkg -l nginx 2>/dev/null || rpm -q nginx 2>/dev/null
1.30.0以前なら影響対象。1.30.1 / 1.31.0以降であればパッチ適用済みだが、関連製品(Plus・Ingress Controller・App Protect WAF等)の確認は別途必要だ。
Step 2: 影響を受けるか判定
ngx_http_rewrite_moduleはほぼ全ビルドに含まれるため、「モジュールの有無」ではなく「脆弱な設定パターンの有無」で判定する。①無名キャプチャ($1)、②置換文字列の?、③後続ディレクティブの3条件が揃う設定が対象だ。
# 無名キャプチャ + ? を含む rewrite を抽出
grep -rnE 'rewrite[^;]*\$[0-9][^;]*\?' /etc/nginx/ 2>/dev/null
# include で読み込む設定も含めて実効設定全体を走査
nginx -T 2>/dev/null | grep -nE 'rewrite[^;]*\$[0-9][^;]*\?'
# Kubernetes は Ingress Controller のバージョンも確認
kubectl get pods -n ingress-nginx -o jsonpath='{.items[*].spec.containers[*].image}'
下記が3条件の揃った典型的な脆弱パターンだ。APIゲートウェイやリバースプロキシで頻出する。
# ===== 脆弱な設定例(3条件成立)=====
server {
location /api/ {
# 危険: $1(無名キャプチャ)+ ? + 後続の set ディレクティブ
rewrite ^/api/(.*)$ /v2/$1?format=json break;
set $upstream http://backend;
proxy_pass $upstream;
}
location /user/ {
# 危険: rewrite 連鎖 + 無名キャプチャ + ?
rewrite ^/user/([0-9]+)$ /profile?id=$1 last;
rewrite ^/profile(.*)$ /api/profile$1 break;
}
}
ヒットが0件でも、Ingressのannotation(rewrite-target)側に無名キャプチャが残っていないかをStep 4の前に必ず確認する。
Step 3: PoC痕跡・攻撃痕跡の確認
DoS試行はワーカープロセスのクラッシュとして、RCE試行は異常に長い多重エンコードURIとしてログに残りやすい。攻撃ペイロードそのものは扱わないが、痕跡の見つけ方は共有できる。
# ワーカープロセスの異常終了(DoSの痕跡)
grep -iE 'worker process [0-9]+ exited on signal|segfault|signal 11' /var/log/nginx/error.log
# 多重URLエンコードを含む異常リクエスト(RCEプローブの痕跡)
awk '{print $7}' /var/log/nginx/access.log | grep -E '(%[0-9a-fA-F]{2}){6,}' | sort | uniq -c | sort -rn | head
# カーネル側にも nginx のクラッシュが残ることがある
dmesg 2>/dev/null | grep -i nginx
クラッシュや異常URIが確認できた場合は、Step 4を待たず先に暫定緩和(named capture書き換え + WAFブロック)を適用する。
Step 4: アップグレード適用
恒久対策はパッチ適用に尽きる。バージョンを上げ、設定テストを通してからリロードする。ダウンタイムは発生しない。
# Debian/Ubuntu
apt-get update && apt-get install --only-upgrade nginx
# RHEL系(AlmaLinux/Rocky含む)
dnf update nginx
# 適用確認 → リロード(無停止)
nginx -v && nginx -t && nginx -s reload
対策手順:named captureへの書き換えとパッチ適用
最優先の対策はパッチ(バージョンアップ)だ。ただし本番環境でのNGINXの即時再起動が困難な場合や、複数の製品スタックを段階的に更新する場合の暫定措置として、設定変更による緩和が有効だ。
# ===== 修正後の設定例:named captureへの書き換え =====
server {
location /api/ {
# 修正前: rewrite ^/api/(.*)$ /v2/$1?format=json break;
# 修正後: 無名キャプチャ $1 を named capture ${path} に置換
rewrite ^/api/(?P<path>.*)$ /v2/${path}?format=json break;
set $upstream http://backend;
proxy_pass $upstream;
}
location /user/ {
# 修正前: rewrite ^/user/([0-9]+)$ /profile?id=$1 last;
# 修正後: named capture ${uid} を使用
rewrite ^/user/(?P<uid>[0-9]+)$ /profile?id=${uid} last;
rewrite ^/profile(.*)$ /api/profile$1 break;
}
}
# 変更後の適用(サービス停止なし)
# nginx -t && nginx -s reload
書き換えのルールはシンプルだ。(.*) のような無名キャプチャを (?P<name>.*) 形式の名前付きキャプチャに変え、参照箇所の$1を${name}に置き換えるだけだ。設定変更後は必ずnginx -tで構文チェックを行い、nginx -s reloadでリロードすることでサービス停止なしに緩和が適用される。
Kubernetes環境の場合はIngressリソースのannotationも確認が必要だ。
# Kubernetes Ingress annotation での named capture 使用例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
# 修正前(脆弱)
# nginx.ingress.kubernetes.io/rewrite-target: /v2/$1?format=json
# 修正後(named capture)
nginx.ingress.kubernetes.io/rewrite-target: /v2/${path}?format=json
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
# 修正前: path: /api/(.*)
# 修正後: named capture を使用
- path: /api/(?P<path>.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 8080
パッチ適用手順:各環境向けアップグレード
NGINX Open Sourceのアップグレード
# Ubuntu/Debian: 公式NGINXリポジトリ使用
apt-get update
apt-get install --only-upgrade nginx
# CentOS/RHEL/AlmaLinux
yum update nginx
# または dnf を使用する場合
dnf update nginx
# バージョン確認(1.30.1以上であることを確認)
nginx -v
# 設定テスト → リロード(ダウンタイムなし)
nginx -t && nginx -s reload
# AlmaLinuxの場合(アドバイザリ al-2026-056 対応)
# https://almalinux.org/blog/2026-05-13-nginx-rift-cve-2026-42945/ を参照
NGINX Plus のアップグレード
NGINX PlusユーザはF5公式アドバイザリ K000161019 を参照し、R32 P6またはR36 P4以上へのアップグレードを実施する。NGINXカスタマーポータルから更新パッケージを取得できる。
Kubernetes Ingress Controllerのアップグレード
# Helm を使用している場合
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--version 5.4.2 # 修正済み最小バージョン
# 更新後の確認
kubectl get pods -n ingress-nginx
kubectl describe pod -n ingress-nginx | grep -i image
SCA / 脆弱性管理での検知
手作業のバージョン確認は1台なら成立するが、数十〜数百のコンテナイメージやホストを抱える環境では破綻する。SCA(Software Composition Analysis)ツールでCVE-2026-42945を含むNGINXパッケージを横断検知し、CIや定期スキャンに組み込むのが現実的だ。コンテナイメージ・OSパッケージ・IaCを横断でスキャンする発想は、Vitest RCE脆弱性(CVE-2026-47429ほか)|影響バージョンの確認・パッチ適用・SCA検知の手順でも同じく有効だった。
| ツール | 種別 | NGINX検知の要点 | CI統合 |
|---|---|---|---|
| Trivy | OSS | コンテナ・ファイルシステム・Gitを横断スキャン。trivy image nginx:1.28 でOSパッケージ層のCVE-2026-42945を即検出 |
GitHub Actions公式アクションあり |
| Grype | OSS | SBOM(Syft連携)ベースで誤検知が少ない。grype dir:/etc/nginx でホスト側も走査 |
SBOM中心の運用に好相性 |
| Snyk | 商用(無料枠あり) | 修正バージョン・到達可能性・優先度を提示。コンテナ+IaCを統合管理 | PRゲート・Slack通知が充実 |
| Aikido | 商用 | 複数OSSスキャナを束ね重複排除。実運用での到達可能性で誤検知を抑制 | ダッシュボードで一元管理 |
# Trivy: 稼働中イメージをスキャンし CVE-2026-42945 を絞り込み
trivy image --severity CRITICAL,HIGH nginx:1.28 | grep -i 'CVE-2026-42945\|nginx'
# Grype: ホストの実ファイルシステムを走査
grype dir:/ --only-fixed | grep -i nginx
SCAは「どこに脆弱なNGINXが残っているか」の地図を描くツールであり、修正そのものはStep 4のアップグレードで別途行う。検知で終わらせないことが肝心だ。
CVE-2026-42945が示す「長期潜伏バグ」の危険性
NGINX Riftは18年間にわたって発見されなかったが、これは特異な事例ではない。近年の重大な脆弱性を振り返ると、XZ Utils backdoor(2024年)、OpenSSH regreSSHion(2024年)、Log4Shell(2021年)など、長年にわたって活用されてきたコアコンポーネントに潜む脆弱性が相次いで発見されている。
問題は「なぜ見つからなかったか」ではなく「なぜ今見つかったか」だ。depthfirstは自律スキャニングツールを使用して発見したと述べている。これはAIや自動化ツールがセキュリティ研究に本格的に組み込まれ始め、人間の目では見落としがちなコーナーケースを系統的に探索できるようになったことを示唆する。裏を返せば、攻撃者側も同様のツールを使って未知のゼロデイを掘り起こす時代に入ったということだ。
今回同時に発見された脆弱性は CVE-2026-42945 だけではない。depthfirstの開示によれば同じコードレビューサイクルで3つの追加CVE(CVSS 6.3〜8.3)も発見されており、NGINXのリライト処理全体に構造的な脆弱性が潜在していた可能性がある。自律スキャニングが攻撃面を掘り起こす流れは、開発ツール側でもClaude CodeのMCP通信ハイジャックでOAuthトークンが窃取される攻撃|検知・対応・防御の手順のように広がっている。
過去の類似事案:古いコードベースに潜むRCE
NGINX Riftの「長く使われたコアコンポーネントに、ある条件でのみ顕在化するメモリ破壊が潜む」という構図は、過去の重大事案と共通する。古いCコードベースほど、当時のテストでは踏まれなかったコーナーケースが残存しやすい。
| 事案 | 対象 | 潜伏期間の目安 | 本質 |
|---|---|---|---|
| NGINX Rift(CVE-2026-42945) | ngx_http_rewrite_module | 約18年 | 2パス処理のフラグ汚染によるヒープoverflow |
| regreSSHion(CVE-2024-6387) | OpenSSH sshd | 復活バグ(旧修正が退行) | シグナルハンドラ競合によるRCE |
| Log4Shell(CVE-2021-44228) | Apache Log4j | 約8年 | JNDIルックアップによる任意コード実行 |
| Apache HTTP Server CVE-2021-41773 | mod パス正規化 | 長期 | パストラバーサル+RCE |
| 過去のNGINX HTTP/2系CVE群 | ngx_http_v2_module | 数年 | フレーム処理のメモリ破壊・DoS |
共通する教訓は3つだ。「枯れている」ことは「安全」を意味しないこと、NGINXのように複数製品(Ingress・WAF・Gateway)へ組み込まれるコンポーネントは1つのCVEが面で波及すること、そしてSCAと定期スキャンを常設し新規CVE公表時に「自社のどこに何バージョンが居るか」を即答できる状態を作っておくことだ。脅威モデルから対策ツールまで体系的に押さえるなら、AIセキュリティとは?LLM時代の脅威モデル・代表的リスク・OSS対策ツールを体系解説する入門ガイドも入口になる。
攻撃を受けた場合の検知・インシデント対応
痕跡の探し方は前述の「⚡ 対応確認の手順」Step 3(workerクラッシュログ・多重エンコードURI・dmesg)にまとめた。ここでは、攻撃が確認できた後に何を順番に実施するかのランブックを示す。アクティブ攻撃が確認された場合は:
- 即時:WAF/ロードバランサでリクエストブロック(後述のIPや特徴的なURIパターン)
- 短期:named captureへの書き換え + nginx -s reload で緩和(ダウンタイムなし)
- 計画:メンテナンスウィンドウで正式パッチ(1.30.1/1.31.0)へアップグレード
- 事後:ログを保全してインシデント分析を実施
開発・運用チームへのチェックリスト
- □ バージョン確認:
nginx -vで 1.30.1 / 1.31.0 以上か確認 - □ 脆弱設定スキャン:
grep -rn 'rewrite.*\$[0-9].*?' /etc/nginx/で無名キャプチャ+?を特定 - □ named captureへの書き換え:
$1→${name}に変更しnginx -t && nginx -s reload - □ Kubernetes確認: Ingress Controllerのバージョン・annotationのキャプチャ形式を確認
- □ NGINX Plus: F5カスタマーポータルからR32 P6 / R36 P4を取得して更新
- □ 関連製品: App Protect WAF / Gateway Fabric / Instance Managerも個別更新
- □ ログ監視: workerプロセスクラッシュログ / 異常URIパターンのアラート設定
- □ ASLR確認:
cat /proc/sys/kernel/randomize_va_spaceが 2 であることを確認(RCEリスク軽減)
NGINX Rift は2026年のWebインフラを直撃した高深刻度脆弱性の一つだ。同時期にはOSS全体でRCEラッシュが続いており、React Router v7 RCE脆弱性 CVE-2026-42211|影響確認とパッチ適用手順やOpenStack Mistral RCE脆弱性(CVE-2026-41283 / CVSS 9.9)|低特権認証→executor RCEの確認と修正手順も同じ「影響確認→暫定緩和→パッチ」の手順で対応が必要だった。さらにNext.js CVE-2026-44578のSSRF(Next.js CVE-2026-44578:WebSocket SSRF(CVSS 8.6)の仕組みと自己ホスト向け緊急対策)、GitHub Actions経由のサプライチェーン攻撃(GitHub Actions pull_request_targetの危険な設定ミスとサプライチェーン攻撃リスク)、そしてLinuxカーネル層でコンテナエスケープを許すCopy Fail(CVE-2026-31431):非特権ユーザーがページキャッシュを4バイト書き換えてroot奪取と並び、2026年4〜5月はWebインフラからカーネルまでセキュリティが集中して試された期間として記録されるだろう。根本的な対策は「パッチを当てる」という一点に尽きる。named captureへの書き換えはあくまで暫定措置であり、次のメンテナンスウィンドウでの正式アップグレードを必ず計画に入れてほしい。
参照ソース
- CVE-2026-42945: Mitigating a Critical Heap Buffer Overflow Vulnerability in NGINX — Akamai
- 18-Year-Old NGINX Rewrite Module Flaw Enables Unauthenticated RCE — The Hacker News
- 18-year-old NGINX vulnerability allows DoS, potential RCE — BleepingComputer
- NGINX Rift CVE-2026-42945: Critical Heap Buffer Overflow Vulnerability Explained — Picus Security
- F5 Security Advisory K000161019 — nginx.org / F5
- NGINX Rift (CVE-2026-42945) Patches Released — AlmaLinux
- Exploitation of Critical NGINX Vulnerability Begins — SecurityWeek