
2026年3月9日、Kubernetes ingress-nginx プロジェクトは CVE-2026-3288 (CVSS 8.8 HIGH)の修正をマージしました。これはNGINX Ingressコントローラーの設定インジェクション脆弱性です。この脆弱性により、Ingressリソースを作成または変更する権限を持つすべてのユーザーが、Ingressパスフィールドにダブルクォート文字(“)を挿入できます。フィールドが入力を適切にサニタイズしないため、攻撃者は引用符で予想される構文を破り、任意のnginx設定ディレクティブを生成された設定に挿入できます。公式勧告では、この脆弱性がリモートコード実行(RCE)およびコントローラーがアクセスできるシークレットの開示につながる可能性があると述べています。
CVE-2026-3288はCVE-2026-24512とも密接に関連しており、これはパスインジェクション脆弱性で1ヶ月前に修正されました。CVE-2026-24512の修正ではsanitizeQuotedRegex()関数が導入され、buildLocation()に適用されましたが、buildProxyPass()に適用されず、rewriteディレクティブが同じクラスのインジェクションに対して脆弱なままになっていました。これらの脆弱性は、ingress-nginx セキュリティ課題の一連の最新のものであり、プロジェクトが月末での廃止につながっています。
Sysdig Threat Research Team (TRT)は両CVEの根本原因を分析し、Kubernetes監査ログ経由でエクスプロイト試行をユーザーに警告するFalco検出ルールを構築しました。Sysdig TRTの脆弱性の完全な分析と知見は以下に詳述されています。
影響を受けるバージョン
- 影響を受ける: NGINX Ingressコントローラーのバージョンv1.13.8、v1.14.4、およびv1.15.0より前
- 修正済み: v1.13.8、v1.14.4、v1.15.0 (2026年3月9日リリース)
- 修正コミット: PR #14667
- 関連: CVE-2026-24512 (buildLocation()経由のパスインジェクション、v1.13.7およびv1.14.3でPR #14501により修正)
根本原因: サニタイゼーションの欠落
NGINX Ingressコントローラーは Kubernetes Ingressオブジェクトをnginx設定に変換します。Ingressがrewrite-targetアノテーションを含む場合、コントローラーはbuildProxyPass()関数を通じて、対応するlocationブロック内にrewriteディレクティブを生成します。template.goでは以下のように見えます:
return fmt.Sprintf(`
rewrite "(?i)%s" %s break;
%v%v %s%s;`, path, location.Rewrite.Target, xForwardedPrefix, proxyPass, proto, upstreamName)
path変数はIngress spec.rules.http.paths.pathフィールドから直接取得され、エスケープなしでダブルクォート付きnginx文字列に挿入されます。パスに(“)文字が含まれている場合、引用符付き正規表現を途中で閉じ、その後のすべてが未処理のnginx設定として解釈されます。
付属の関数buildLocation()は1ヶ月前にCVE-2026-24512の一部として修正されました。その修正(PR #14501)ではsanitizeQuotedRegex()関数が導入され、これは\と"文字をエスケープし、buildLocation()に適用されました:
func buildLocation(input interface{}, enforceRegex bool) string {
path := sanitizeQuotedRegex(location.Path)
if enforceRegex {
return fmt.Sprintf(`~* "^%s"`, path)
}
// ...}
しかし、同じ修正はbuildProxyPass()に適用されませんでした。PR #14667のCVE-2026-3288の修正では、同じsanitizeQuotedRegex()呼び出しをbuildProxyPass()に追加します。任意のコード実行の欠陥を避けるための1行の変更です。
インスペクターのバイパス
NGINX Ingressコントローラーには、Ingressオブジェクトを処理前に検証するDeepInspect関数が含まれています。このインスペクターは各パスをCheckRegex経由で実行し、既知の危険なnginxディレクティブのブロックリストと照合します:
invalidAliasDirective = regexp.MustCompile(`(?s)\s*alias\s*.*;`)
invalidRootDirective = regexp.MustCompile(`(?s)\s*root\s*.*;`)
invalidEtcDir = regexp.MustCompile(`/etc/(passwd|shadow|group|nginx|ingress-controller)`)
invalidSecretsDir = regexp.MustCompile(`/var/run/secrets`)
invalidByLuaDirective = regexp.MustCompile(`.*_by_lua.*`)
このブロックリストは不完全です。 return、set、try_filesなどのディレクティブはチェックされず、エラーなしで通過します。returnがインスペクターをバイパスし、インジェクションされたペイロードで正常に実行されることを確認しました。
さらに、インスペクターは英数字のみのパスを強制するvalidPathType正規表現を定義します:
validPathType = regexp.MustCompile(`(?i)^/[[:alnum:]._\-/]*$`)
この正規表現は呼び出されることはありません。デッドコードとして存在し、インスペクターが(“)、(,)、(;)、スペース、#、およびその他の特殊文字などを含むパスを制限なしで受け入れることを意味します。
エクスプロイテーション
前提条件
攻撃者は、脆弱なNGINX Ingressコントローラーを実行しているクラスター内の任意のネームスペースで Ingressリソースを作成または変更する権限を持つ必要があります。
影響
公式勧告では、この脆弱性が任意のコード実行とコントローラーがアクセスできるシークレットの開示につながる可能性があると述べています。デフォルトのインストールでは、NGINX Ingressコントローラーはクラスター全体のすべてのシークレットにアクセスできます。インスペクターのブロックリストはincludeやssl_engineなどのディレクティブをカバーしていません。これらは、テストした内容を超えるコード実行またはファイル開示へのパスを提供する可能性があります。
テスト中、Sysdig TRTは、インスペクターがブロックしないreturnディレクティブを使用して、以下の攻撃シナリオが可能であることを確認しました:
- レスポンスをハイジャックして、任意のパスで攻撃者が管理するコンテンツを提供します。
- ユーザーをリダイレクトしてフィッシングページまたは認証情報収集サイトに誘導します。
- 認証情報を盗むために、
$http_authorizationなどのnginx変数を使用してベアラートークン、APIキー、またはBasic認証の認証情報をレスポンスボディに反映させます。 - 内部状態をリークして、
$server_addrなどのnginx変数を返し、コントローラーポッドの内部IPアドレスを公開します。 - サービスを拒否して、nginxの再ロードを防ぐ無効な設定をインジェクションします。
Sysdig脅威インテリジェンス
この脆弱性の検出は、Sysdig Secure脅威インテリジェンスページに追加され、ホーム→脅威インテリジェンスでアクセスするか、「NGINX Ingressコントローラーのリモートコード実行脆弱性」を検索することで利用可能です。
Falcoでの検出
以下のFalcoルールは、Kubernetes監査ログデータを使用して、パスにダブルクォートが含まれるIngressリソースの作成または変更を検出します:
rule: Ingress-NGINX Path Configuration Injection
desc: >
パスフィールドにダブルクォート文字が含まれるKubernetesIngressリソースを検出し、CVE-
2026-3288 (buildProxyPass)またはCVE-2026-24512 (buildLocation)経由のingress-nginx設定インジェクションの可能性を示します。両方の脆弱性はパスフィールドを
インジェクションベクトルとして使用します。
condition: >
kevt and ingress and kmodify and response_successful
and jevt.value[/requestObject/spec/rules/0/http/paths/0/path] contains "\""output: >
設定インジェクション文字を持つ疑わしいingressパスが検出されました -
CVE-2026-3288 / CVE-2026-24512の可能性があります
(user=%ka.user.name
verb=%ka.verb
ingress=%ka.target.name
ns=%ka.target.namespace
path=%jevt.value[/requestObject/spec/rules/0/http/paths/0/path])
priority: CRITICAL
source: k8s_audit
tags: [k8s, cve-2026-3288, cve-2026-24512, ingress-nginx, config-injection]
CVE-2026-3288とCVE-2026-24512の両方は、Ingressパスフィールドに(“)文字を必要とします。これは正当なIngress定義には存在しません。これは、単一のルールで両方の脆弱性をカバーする高い信頼性の検出シグナルになります。
Sysdig Secureのお客様は、Sysdig K8s Notable EventsのIngress-NGINX悪意のあるアノテーションまたはパスインジェクションで自動的に保護されており、質問はユーザーのSysdigアカウントチームに向けられるべきです。
検出の仕組み
SysdigとFalcoはKubernetes監査イベントのIngress作成、更新、またはパッチ操作(kmodify)が正常に完了(response_successful)したかを監視します。その後、jevt.value[/requestObject/spec/rules/0/http/paths/0/path]を通じて生リクエストボディを検査し、Ingress仕様の最初のHTTPパスからパス値を抽出します。その値に(“)文字が含まれている場合、検出はアラートを送信します。
検証中、同じクラスターに良性のIngress(path: /app)とエクスプロイトIngressをデプロイしました。アラートは、作成操作と更新操作で独占的にエクスプロイトIngress上で発火し、良性リソースで偽陽性がゼロになりました。
推奨事項
- 更新ingress-nginxをv1.13.8、v1.14.4、またはv1.15.0に更新してください。これらには
buildProxyPass()内のsanitizeQuotedRegex()修正が含まれています。 - デプロイKubernetes監査ログ経由でエクスプロイト試行を検出するために上記のFalcoルールをデプロイしてください。
- 制限ルールベースのアクセス制御(RBAC)を使用してIngress作成権限を制限し、Ingressリソースを作成または変更できるユーザーとサービスアカウントを制限してください。
- 確認ingress-nginx admission webhookが有効化されていることを確認してください(Helmチャートではデフォルトで有効です)。これは生成された設定に対して
nginx -tを実行し、無効な設定を生成するIngressオブジェクトを拒否します。 - 監査既存のIngressリソースで特殊文字を含むパスを確認してください:
kubectl get ingress -A -o json | jq '.items[].spec.rules[].http.paths[].path' | grep '[";\\#]'. - 監視「受信した無効なingress」メッセージについてNGINX Ingressコントローラーログを監視してください。これはインスペクターが潜在的に悪意のあるIngressを拒否したことを示します。
軽減策
複数のレイヤーの防御が、本番環境での成功したエクスプロイテーションの可能性を低減します。
- これはインターネット公開の脆弱性ではありません。攻撃者はKubernetes APIに認証され、Ingressリソースを作成または変更する権限を持つ必要があります。最も現実的な脅威は、侵害されたCI/CDパイプラインまたはネームスペースレベルのアクセス権を持つ悪意のある内部者です。
- アドミッションウェブフックが一部のペイロードをキャッチします。 ingress-nginx Helmチャートは、デフォルトでアドミッションウェブフックを有効にし、受け入れ前に生成されたnginx設定を検証します。テスト中、エクスプロイトをデプロイするためにウェブフックを削除する必要がありました。ただし、有効なnginx構文を生成するペイロード(
return200など)はこのチェックをパスし、ブロックされません。 - 2番目のサニタイゼーション関数が新しいバージョンでのリーチ可能性を制限します。 CVE-2026-24512の修正が適用されたv1.13.7またはv1.14.3を実行しているクラスターでは、付属の関数
buildLocation()がパスを正しくエスケープし、正当なHTTPリクエストが照合できないlocation正規表現を生成します。インジェクションされたディレクティブはnginx設定に存在しますが、トリガーできません。ただし、buildLocation()もサニタイズされない古いバージョンを実行している組織の場合、location正規表現は照合可能であり、インジェクションされたコードはHTTPリクエストを経由して直接アクセス可能です。
結論
CVE-2026-3288は、CVE-2026-24512の不完全な修正に起因する設定インジェクション脆弱性です。sanitizeQuotedRegex()が2026年2月にbuildLocation()を保護するために導入されたとき、同じサニタイゼーションがbuildProxyPass()に適用されず、rewriteディレクティブが同じクラスのパスインジェクションに対して脆弱なままになっていました。インスペクターの既知の危険なディレクティブのブロックリストへの依存と、呼び出されることのないデッドコード検証の組み合わせは、幅広いインジェクションペイロードが検出なしで通過することを意味します。
この脆弱性は、CVE-2026-24512(buildLocation()経由のパスインジェクション)、CVE-2021-25742(スニペットインジェクション)、およびCVE-2024-7646(\r経由のアノテーションベースのインジェクション)を含む、以前のingress-nginx設定インジェクション CVEで見られたパターンに従います。各インスタンスは、ユーザー管理入力をnginx設定テンプレートに安全に挿入することの困難さを強調しています。
ingress-nginxを実行している組織は、v1.14.4以降への更新を優先し、即座なパッチ適用が不可能な環境でエクスプロイト試行をキャッチするためにSysdig SecureまたはFalco検出ルールをデプロイする必要があります。
Kubernetes & コンテナセキュリティ
クラウド検出 & 対応
