Security Digest · Mar 24, 2025 · Vulnerability · Containers

IngressNightmare: ingress-nginx Cluster Takeover RCE

Five ingress-nginx bugs, led by CVE-2025-1974 (9.8), let pod-network attackers take over clusters. Fixed in 1.11.5/1.12.1. Verdict: check exposure.

Our verdict

Check exposure

Patched since March 2025. If any cluster still runs ingress-nginx below 1.11.5 or 1.12.1, that is a cluster-takeover risk, and the controller itself is now retired, so plan the migration while you check.

Who must act: Anyone running the Kubernetes community ingress-nginx controller older than v1.11.5 or v1.12.1 with the validating admission webhook enabled, especially if the webhook is reachable beyond the API server.

Who can relax: Clusters with no ingress-nginx pods (including those using F5/NGINX Inc.'s separate NGINX Ingress Controller or other controllers) and clusters already on 1.11.5, 1.12.1 or later.

Affected
ingress-nginx before v1.11.0
ingress-nginx v1.11.0 through v1.11.4
ingress-nginx v1.12.0
Fixed in
ingress-nginx v1.11.5
ingress-nginx v1.12.1
CVSS
9.8 (v3.1, CNA)
EPSS
99.4% (percentile 99.9)
CISA KEV
Not listed
Exploitation
Public proof-of-concept
Severity
Critical

What to do

  1. Find controllers: kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx, and note the image tags.
  2. Upgrade to ingress-nginx v1.11.5, v1.12.1 or any later release.
  3. If you cannot upgrade, disable the validating admission webhook (Helm: controller.admissionWebhooks.enabled=false; manual: delete the ingress-nginx-admission ValidatingWebhookConfiguration and remove --validating-webhook), then re-enable it after upgrading.
  4. Use NetworkPolicy so only the Kubernetes API server can reach the admission webhook port, and make sure it is never exposed to the internet.
  5. Plan a migration to Gateway API or another ingress controller, since ingress-nginx stopped receiving releases after March 2026.

How to check if you are affected or compromised

  • List controller image versions across all clusters and compare them against v1.11.5 / v1.12.1.
  • Check whether the admission webhook Service is reachable from workloads or from outside the cluster.
  • Review controller pod logs and audit logs for unexpected AdmissionReview requests or nginx -t errors mentioning ssl_engine or unusual annotations; the Kubernetes advisory lists no known IoCs.

What happened#

On March 24, 2025, the Kubernetes Security Response Committee announced fixes for five vulnerabilities in ingress-nginx, the community ingress controller that it says runs in over 40% of Kubernetes clusters. Wiz Research, which found the bugs, named the set IngressNightmare.

Three of the bugs are configuration injection flaws, each scored CVSS 8.8 (High): CVE-2025-24514 (auth-url annotation), CVE-2025-1097 (auth-tls-match-cn annotation) and CVE-2025-1098 (mirror annotations). On their own they require permission to create an Ingress object. CVE-2025-24513 is a path traversal in the admission controller, scored 4.8. The critical one is CVE-2025-1974 (CVSS 9.8). The validating admission webhook ran nginx -t against configuration built from the incoming request, so anyone who could reach the webhook over the pod network could deliver those injections with no credentials at all.

Wiz's chain worked like this. First, an attacker sends a crafted AdmissionReview straight to the webhook. The injected ssl_engine directive then loads a shared library that was smuggled in through NGINX's client-body temp file and is still reachable via /proc. The result is code execution in the controller pod. In a default install that pod can read every Secret in the cluster, which usually means full cluster takeover.

Who is affected#

Affected: ingress-nginx before v1.11.0, v1.11.0 through v1.11.4, and v1.12.0. Fixed: v1.11.5 and v1.12.1. The 1.10.x and older lines never received a patch. This is the kubernetes/ingress-nginx project, not the separate NGINX Ingress Controller from F5/NGINX Inc. To check whether you run it, use kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx. No pods means you are not affected.

Do you really need to act?#

At disclosure Wiz estimated that about 43% of cloud environments were vulnerable, and it found over 6,500 clusters exposing vulnerable admission controllers to the public internet. Those clusters were at serious risk. For everyone else, the realistic attacker is something already inside: a compromised pod, a VPC neighbor, or a user on the corporate network. The Kubernetes post notes that in many setups the pod network is reachable from all of those. The CVSS attack-vector rating was debated in the advisory thread (Network vs. Adjacent), but either way no credentials are needed.

Exploit code is public. Wiz's database reports a public exploit and very high EPSS. As of the October 21, 2026 snapshot, none of the five CVEs is in CISA KEV, and we found no confirmed in-the-wild campaign in the sources we reviewed. Nineteen months on, most maintained clusters have upgraded. The open risk is forgotten clusters and pinned Helm charts. One more factor: Kubernetes retired ingress-nginx, and best-effort maintenance ended in March 2026, so any future bug will not be fixed.

What to do now#

  1. Inventory every cluster with the kubectl selector above and record the image tags.
  2. Upgrade to v1.11.5, v1.12.1 or later.
  3. If you can't upgrade yet, disable the admission webhook. With Helm, set controller.admissionWebhooks.enabled=false. For manual installs, delete the ingress-nginx-admission ValidatingWebhookConfiguration and remove --validating-webhook from the controller args. Turn it back on after upgrading.
  4. Restrict the webhook with NetworkPolicy so that only the API server can reach it.
  5. Start migrating to Gateway API or another maintained controller.

How to tell if you were hit#

The Kubernetes advisory lists no known indicators of compromise. Ask security@kubernetes.io about suspected exploitation. Check whether the webhook Service was reachable from untrusted networks while you ran a vulnerable version. Review controller logs for AdmissionReview requests that did not come from the API server, and for nginx -t failures that mention ssl_engine or odd annotations. If exposure was plausible, rotate the Secrets the controller could read, which in default installs means all of them, and review recent RBAC and workload changes.

Timeline#

  • — Wiz reports CVE-2025-1974 and CVE-2025-24514 to Kubernetes.
  • — Last of the injection bugs (CVE-2025-1098) reported.
  • — Config validation removed from the admission controller (internal fix for CVE-2025-1974).
  • — Public disclosure; ingress-nginx v1.11.5 and v1.12.1 released.
  • — Kubernetes announces ingress-nginx retirement; best-effort maintenance until March 2026.

Vulnerability records

  • CVE-2025-1974 · A security issue was discovered in Kubernetes where under certain conditions, an unauthenticated attacker with access to the pod network can achieve arbitrary…
  • CVE-2025-1097 · A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where the `auth-tls-match-cn` Ingress annotation can be used to…
  • CVE-2025-1098 · A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where the `mirror-target` and `mirror-host` Ingress annotations…
  • CVE-2025-24514 · A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where the `auth-url` Ingress annotation can be used to inject…
  • CVE-2025-24513 · A security issue was discovered in ingress-nginx https://github.com/kubernetes/ingress-nginx where attacker-provided data are included in a filename by the…

Sources

Original sources first: vendor and project advisories, CVE and government records, the discoverers’ write-ups. Every claim above links to one of these. See how the Security Desk works.

Original and primary sources

  1. Kubernetes Blog — Ingress-nginx CVE-2025-1974: What You Need to Know kubernetes.io
  2. Kubernetes GitHub — CVE-2025-1974: ingress-nginx admission controller RCE escalation github.com
  3. Kubernetes GitHub — CVE-2025-24513: auth secret file path traversal github.com
  4. Wiz Research — IngressNightmare: critical unauthenticated RCE vulnerabilities in ingress-nginx wiz.io
  5. Wiz — CVE-2025-1974 vulnerability database entry wiz.io
  6. Kubernetes Blog — Ingress NGINX Retirement: What You Need to Know kubernetes.io