NGINX Riftの理解:RCEにつながる10年前のヒープバッファオーバーフロー
"NGINX Rift"(CVE-2026-42945)と名付けられた重大なセキュリティ脆弱性が最近明らかになり、NGINXウェブサーバーの ngx_http_rewrite_module におけるヒープバッファオーバーフローが露呈しました。この発見が特に憂慮すべきなのは、その存続期間の長さです。報告によると、このバグは2008年に遡るバージョン 0.6.27 から存在していました。
この脆弱性は、認証なしのリモートコード実行(RCE)を可能にし、URL書き換えにNGINXを利用しているあらゆるインフラストラクチャに重大なリスクをもたらします。この発見は、DepthFirstによる自動セキュリティ分析ツールを使用して行われ、レガシーなコードベースにおける根深い欠陥を明らかにする上でのAI支援型脆弱性調査の能力の向上を示しています。
技術的な根本原因
この脆弱性は、古典的な「2パス」スクリプトエンジンのバグに起因しています。ngx_http_rewrite_module において、NGINXは最初のパスで長さの計算を行い、2番目のパスで ngx_escape_uri を使用して実際のコピーパスを実行します。
これら2つのパスの間の不一致、具体的には rewrite ディレクティブの置換文字列に疑問符(?)が含まれており、その後に set、if、または別の rewrite ディレクティブが続く場合に、ヒープバッファオーバーフローが発生します。これは、エンジンがエスケープされたURIの最終的なサイズを正しく計算できず、割り当てられたメモリ境界を超えて書き込みを行ってしまうために発生します。
エクスプロイト・チェーン
ヒープオーバーフローは出発点に過ぎず、それを信頼性の高いRCEに変換するには、高度なエクスプロイト・チェーンが必要です。公開されている概念実証(PoC)は、以下のいくつかの高度な手法を通じてこれを示しています。
- Cross-Request Heap Feng Shui: エクスプロイトは、複数のリクエストにわたってヒープのレイアウトを操作し、ターゲットとなるオブジェクトを予測可能な場所に配置します。
- Pool Cleanup Pointer Corruption: NGINXのメモリプール・クリーンアップ・メカニズム内のポインタを破損させることで、攻撃者はアプリケーションの制御フローを乗っ取ることができます。
- ASLR Considerations: 現在の公開PoCは、アドレス空間配置のランダム化(ASLR)が無効であることを前提としています。しかし、セキュリティ専門家は、ASLRが有効であってもシステムが安全であるとは限らないと警告しています。
"ASLRは、攻撃をより困難にするための防御層(defense-in-depth)技術です。ほとんどの場合、ASLRの回避は時間の問題であり、スキルの問題に過ぎません... 「ASLRが有効であれば、この脆弱性によるリスクはない」と言うのは、明らかに間違っています。"
緩和策と修正方法
即時のパッチ適用
F5は、影響を受けるバージョンに対してパッチをリリースしています。ユーザーは 1.31.0 または 1.30.1 (オープンソース版)にアップデートし、NGINX Plusの最新アップデートを適用する必要があります。OpenRestyも、バージョン 1.27 および 1.29 に対してパッチを提供しています。
設定による回避策
即時のパッチ適用が不可能な場合は、重要な設定レベルの緩和策があります。この脆弱性は、書き換え定義における名前のないキャプチャグループ(例:$1、$2)の使用によって引き起こされます。
修正方法: 名前のないキャプチャを名前付きキャプチャに置き換えてください。例えば、$1 や $2 の代わりに、$user_id や $section を定義して使用します。
リスクの評価
次のようなNGINX設定が含まれている場合、リスクがある可能性があります。
- 置換文字列に
?を含むrewriteディレクティブ。 - 名前のないキャプチャグループ(
$1のようなもの)の使用。 - それらのキャプチャを参照する、後続の
set、if、またはrewriteディレクティブ。
ngx_http_rewrite_module またはこれらの特定のパターンを使用していない場合、システムは影響を受けていない可能性が高いです。
インフラストラクチャへの広範な影響
"NGINX Rift"の脆弱性は、重要なインターネットインフラストラクチャにおけるレガシーなCベースのソフトウェアへの依存について、より広範な議論を巻き起こしています。世界で最も使用されているウェブサーバーの一つにおいて、バグが20年近くも存続し得たという事実は、メモリ安全でない言語の脆弱性を浮き彫りにしています。
この出来事は、「防御層(defense-in-depth)」戦略の必要性を強調しています。ASLRのような単一の緩和策に頼ることは不十分です。根本原因であるメモリ破損を解決するために、パッチを適用する必要があります。自動分析ツールがこのような「干草の中の針」のようなバグを見つける能力が高まるにつれ、発見から武器化までの期間は短縮しており、迅速なパッチ管理がかつてないほど重要になっています。