2025年5月、IngressNightmareと名付けられた重大なセキュリティ脆弱性CVE-2025-1974が公開され、クラウドネイティブインフラに広く展開されているKubernetesのingress-nginxコントローラに影響を与えました。この脆弱性は、認証されていない攻撃者がNGINXに任意の設定を注入することを可能にし、不正なRCE(リモートコード実行)やクラスタの完全な侵害につながる可能性があります。
OPSWAT フェローシップ・プログラムの一環として、フェローたちは、この深刻度の高い問題を取り巻く根本原因、悪用経路、緩和策をよりよく理解するために、徹底的な技術分析を行った。
CVE-2025-1974の概要
CVE-2025-1974は、ingress-nginxの1.11.4までのバージョン、特に1.12.0で確認されたテンプレートインジェクションの重大な脆弱性です。Kubernetes クラスタにノードレベルでアクセスできる攻撃者は、この欠陥を悪用して、デフォルトではクラスタ内の重要な秘密へのアクセスを含む広範な権限を持つ ingress-nginx コントローラ経由で RCE を使用して任意のコードを実行できます。
Kubernetesセキュリティ対応委員会は、この脆弱性にCVSS v3.1スコア9.8(重大度)を割り当てた:
この分析における主な要素
Kubernetesの概要
Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、運用管理を自動化するためのオープンソースプラットフォームだ。Kubernetesクラスタは通常、物理ハードウェアと仮想マシンの両方を含む複数のマシンで構成され、高可用性、スケーラブル、管理可能なアプリケーション環境を提供するために集合的に動作します。
NGINXイングレスコントローラ
NGINXイングレスコントローラ(ingress-nginx)は、NGINXウェブサーバの上に構築されたオープンソースのイングレスコントローラです。Kubernetesクラスタ内で動作し、主にリバースプロキシとロードバランサとして機能します。このコントローラは、ユーザーによって定義されたIngressリソースを解釈し、それらを実行可能なNGINX設定に変換して、クラスタへのトラフィックフローとクラスタ内のトラフィックフローをルーティングします。
入学審査とその役割
Ingress-nginxは、AdmissionReviewと呼ばれるWebhookサービスを使用してKubernetesと統合します。このサービスは、ネイティブのKubernetes Ingressオブジェクトを処理し、検証された構文的に正しいNGINXコンフィギュレーションに変換するために重要です。AdmissionReviewは設定の正確性を保証する一方で、ingress-nginxコントローラから独立して動作し、一般的に厳格な認証制御を欠いています。この厳格な認証の欠如が、CVE-2025-1974の悪用可能性に寄与した重要な要因です。
脆弱性の悪用と技術的分析
搾取メカニズム
CVE-2025-1974の悪用の核心は、悪意のあるリクエストから始まります。攻撃者はAdmissionReviewウェブフックへの悪意のあるリクエストを作成し、NGINXに実行時に共有ライブラリを動的にロードさせます。このメカニズムに基づき、研究チームはこの悪用経路を理解するために、AdmissionReviewウェブフックとNGINXワークフローの両方を分析しました。
テンプレート・インジェクションの脆弱性
AdmissionReview webhookでは、受信リクエストを処理する際に、CheckIngress関数がKubernetes Ingress Objectsを有効なNGINX設定ファイルに変換します。フローは次のように進みます:
- 各設定は解析され、generateTemplateに渡され、定義済みの NGINX テンプレートに従ってフォーマットされます。
- その後、testTemplateは基礎となる NGINX バイナリに対して生成された構成を検証します。
すべてのNGINXの設定は、ingress-nginxソースコード内のnginx.tmplファイルにある定義済みのテンプレートに基づいています:
generateTemplate関数内で、コンフィギュレーションは以下のコード・スニペットのように処理されます:
しかし、入力検証とサニタイズは不十分です。具体的には、Ingress オブジェクトのuidフィールドが NGINX 構成テンプレートに直接挿入され、インジェクションポイントが作成されます。攻撃者は、uid="1234#; \n}n}n injection_value "のような細工した入力を供給することで、これを悪用できます。
この悪意のある入力により、NGINX テンプレートへのグローバルスコープインジェクションが可能になり、攻撃者は任意の NGINX ディレクティブをトリガーして RCE を達成できる可能性があります。
テンプレート・インジェクションからリモート・コード実行へ
testTemplate()関数の説明
generateTemplate関数によってNGINX設定が生成された後、testTemplate関数は一時的な設定ファイルを作成し、nginx -c {config_file}コマンドでNGINXライブラリを実行します。-t.これにより、NGINXバイナリが強制的に構成を解析して検証します。
この脆弱性を悪用するには、攻撃者は悪意のあるコードを実行できるディレクティブを特定する必要があります。なぜなら、このディレクティブはNGINXが外部プラグインをロードすることを可能にするからである。しかし、このディレクティブは設定解析の初期段階でのみ許可されており、今回のインジェクションポイントとは一致しません。
この課題を解決するため、さらに調査を続けた結果、ssl_engineディレクティブにたどり着いた。これは、モジュールを動的にロードする機能によって好奇心を引き起こし、より深い調査が必要となった。
ssl_engine ディレクティブを理解する
NGINXがssl_engineディレクティブをどのように処理するのかを深く理解し、NGINXがこのディレクティブを介して追加モジュールの動的ロードを許可する条件を判断するために、NGINXのソースコードを調べました。
起動時にNGINXは初期状態をロードし、設定ファイルを一行ずつ解析します。各ディレクティブはnginx_command_t構造体で処理され、ssl_engineディレクティブはngx_openssl_commands を直接呼び出します。
ngx_openssl_commands関数を分析したところ、この関数はOpenSSLのサポート、特にハードウェアアクセラレーションSSLモジュールに使用されるENGINE_by_id関数に依存していることがわかりました。
そして、ENGINE_by_id関数を分析するうちに、この関数が共有ライブラリーのダイナミック・ロードを可能にしていることがわかった。さらに、ライブラリが__attribute__((コンストラクタ))拡張でコンパイルされている場合、関連する関数はロード時に即座に実行することができる。これは、ssl_engineディレクティブを悪用することで、攻撃者がホスト上で任意の共有ライブラリをロードし、RCE を引き起こす可能性があることを示している。
共有ライブラリの標的と攻撃戦略
コードの実行を確実に促進するために、次のステップでは共有ライブラリを特定します。外部ライブラリに依存するよりも、NGINX 自身の動作から、より実行可能で制御可能なアプローチとして、クライアントボディバッファメカニズムがあります。この機能により、NGINX は大きな受信リクエストを一時ファイルにオフロードすることができ、予測可能なファイル処理動作に基づく悪用の機会を開くことができます。
デフォルトでは、受信リクエストが8KBを超えると、NGINXは/tmp/nginx/client-bodyにある一時ファイルにリクエストボディを書き込みます。これらの一時ファイルは、受信したメッセージのチャンクが成功するまでの間、最大60秒間保持されます。
リクエストボディの一部を一時ファイルに書き込んだ後、NGINXはボディ全体を受信するまで削除を延期します。リクエストが不完全なままで、最大60秒間データが受信されない場合、ファイルは最終的に消去されます。しかし、最後のデータチャンクを意図的に保留することで、攻撃者は一時ファイルを使用し続けることができ、悪用が可能になります。
アップロードされたファイルの内容を制御することはできるが、ファイル名が ランダムに生成されるため、ファイルシステム上でそれを見つけるのは難しい。保存パスはclient_body_temp_pathを使って設定できるが、ファイル名は実行時にランダムに生成されるため、予測不可能である。このランダム性は、ブルートフォース(総当たり)を使ったとしても、標的を絞ったアクセスを著しく妨げる。これを克服するために、チームはLinux OSに固有の動作を利用した。次の例を考えてみよう:
This code opens a file and keeps it in an active state, closely mimicking the behavior of NGINX's client body buffer mechanism. Using /proc/{pid}/fd directory, attackers can find symbolic links created by the Linux kernel that map open file descriptors to their corresponding file paths. This route allows attackers to reduce the brute-force space to only two variables: the process ID (pid) and the file descriptor (fd).
搾取のシミュレーション
上記の分析に基づくと、Ingress-NGINXポッド内でのRCEに対する実用的なエクスプロイト・アプローチは次のようになる:
- NGINXのクライアントボディバッファメカニズムを使用して悪意のある共有ライブラリをアップロードし、ファイルシステムに一時的に保存します。
- テンプレートインジェクションを使用して、脆弱なディレクティブを使用して、NGINXに以前にアップロードされた共有ライブラリをロードさせるブルートフォース試行を開始します。
共有ライブラリを含むペイロードの作成
ロード時のコード実行を確実にするため、悪意のある共有ライブラリ内にコンストラクタ拡張を持つエントリポイント関数が定義されています。この関数は、NGINXによるロード時に実行され、リモートホストへのリバースシェル接続を確立するように設計されています。
コンパイル後、出来上がった共有ライブラリのサイズは快適に8KBを超え、追加のパディングを必要とせずにNGINXでバッファリングできるようになった。
そして、サイズの不一致を引き起こすために、Content-Lengthの値を膨らませたリクエスト(例えば、1MB)を作成した。これによりNGINXはボディ全体を即座に処理するのではなくバッファリングし、共有オブジェクトが予測可能な場所に書き込まれるようにした。
インジェクションによる共有ライブラリのトリガー
共有ライブラリを配置した状態で、次に脆弱なuidフィールドを使用してNGINX設定に悪意のあるディレクティブを注入しました。このディレクティブには、バッファリングされたファイルパスを指すssl_engineが含まれていました:
RCE を成功させるには、ssl_engineディレクティブがバッファリングされたファイルへの 正しいパスを参照する必要がある。これは、バッファされた共有オブジェクトを指す有効なシンボリックリンクを特定するために、プロセス ID とファイル記述子の可能な組み合わせを系統的に反復する自動化された総当たりスクリプトによって達成できる。
以下は、エクスプロイトのトリガーとなったNGINXテンプレートの生成サンプルです。
悪用に成功すると、攻撃者はingress-nginxポッドのコンテキスト下でシェルアクセスを得ることができる。
緩和と修復
CVE-2025-1974に関連するリスクを効果的に軽減するために、企業はオープンソースコンポーネントの可視化と制御を提供するソリューションを必要としています。
MetaDefender® プラットフォームの基盤技術であるOPSWAT SBOMは、使用中のすべてのソフトウェアコンポーネント、ライブラリ、Dockerコンテナ、依存関係のインベントリを提供することで、このニーズに対応します。これにより、組織はコンポーネントをプロアクティブに追跡、保護、更新することができます。
上記の例では、MetaDefender Core™のSBOMテクノロジが、CVE-2025-1974脆弱性を含むnginx-ingress-controllerパッケージをスキャンしました。システムは自動的にこの問題をクリティカル(Critical)としてフラグを立て、利用可能な修正バージョンに関するガイダンスを提供し、チームは脆弱性が悪用される前に迅速に優先順位を決めてパッチを適用することができました。
OPSWAT SBOMは、MetaDefender Core MetaDefender Software Supply Chain™で利用可能で、セキュリティチームが脆弱性をより迅速に特定し、対処することを可能にします。OPSWAT SBOMにより、セキュリティチームは以下のことが可能になります:
- 脆弱なコンポーネントの迅速な特定- デシリアライズ攻撃の影響を受けるオープンソースのコンポーネントを即座に特定します。これにより、脆弱なライブラリにパッチを適用するか、置き換えるかの迅速な対応が可能になります。
- プロアクティブなパッチ適用とアップデートの確保-OPSWAT SBOMを通じてオープンソースのコンポーネントを継続的に監視し、デシリアライゼーションの脆弱性を未然に防ぎます。OPSWAT SBOMは、古くなったコンポーネントや安全でないコンポーネントを検出できるため、タイムリーなアップデートが可能になり、攻撃にさらされる機会を減らすことができます。
- コンプライアンスとレポーティングの維持-OPSWAT SBOMは、ソフトウェア・サプライ・チェーンにおける透明性を求める規制の枠組みが強化される中、企業がコンプライアンス要件を満たすのを支援します。