
Walkthrough: ingress-nginx Configuration Injection via rewrite-target Annotation
Keywords: CVE-2026-3288, ingress-nginx vulnerability, Kubernetes security, nginx configuration injection, rewrite-target annotation, RCE, Secret disclosure, CWE-20, CAPEC-176, ingress-nginx CVE 2026, Kubernetes cluster compromise
A security issue was discovered in ingress-nginx where the nginx.ingress.kubernetes.io/rewrite-target Ingress annotation can be used to inject configuration into nginx. This can lead to arbitrary code execution in the context of the ingress-nginx controller, and disclosure of Secrets accessible to the controller. (Note that in the default installation, the controller can access all Secrets cluster-wide.)
Discovered by: Kai Aizen
Published: March 9, 2026
CVSS Score: 8.8 (High)
CWE: CWE-20 — Improper Input Validation
CAPEC: CAPEC-176 — Configuration/Environment Manipulation
Component: ingress-nginx
Attack Type: Nginx Configuration Injection via Ingress Annotation
Required Privileges: Low (PR:L)
The nginx.ingress.kubernetes.io/rewrite-target Ingress annotation is intended to modify the request path before it is forwarded to upstream services. However, the implementation allows injection of arbitrary configuration directives directly into the underlying nginx configuration.
An attacker with the ability to create or modify Ingress resources can leverage this to:
| Impact Area | Severity |
|---|---|
| Confidentiality | High — Full Secret disclosure (cluster-wide in default config) |
| Integrity | High — Arbitrary code execution in controller context |
| Availability | High — Full compromise of ingress-nginx controller |
The core issue is that ingress-nginx processes the rewrite-target annotation value without sufficient input validation, allowing attacker-controlled content to be written directly into the nginx configuration. This is a configuration injection vulnerability — the annotation value is trusted as a simple rewrite path but can contain arbitrary nginx directives.
The vulnerability is reachable by any user with permissions to create or modify Ingress resources in a cluster running ingress-nginx. The attack requires:
This vulnerability belongs to a well-established class of annotation injection bugs in ingress-nginx:
The recurring pattern: annotation values flow into nginx configuration without adequate sanitization. Different annotations, same root cause.
| Branch | Vulnerable | Fixed |
|---|---|---|
| 1.13.x | < 1.13.8 | 1.13.8 |
| 1.14.x | < 1.14.4 |
# Check if ingress-nginx is installed
kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx
# Check ingress-nginx version
kubectl exec -n ingress-nginx \
$(kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}') \
-- /nginx-ingress-controller --version
If you do not have ingress-nginx installed on your cluster, you are not affected.
Upgrade ingress-nginx to the patched version for your branch:
# Using Helm
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--version <patched-chart-version>
Refer to the official upgrade documentation: Upgrading Ingress-nginx
Use admission control to block the use of the rewrite-target annotation until you can upgrade:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: block-rewrite-target
webhooks:
- name: block-rewrite-target.security.local
rules:
- apiGroups: ["networking.k8s.io"]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["ingresses"]
clientConfig:
# Point to a webhook service that rejects Ingress resources
# containing the rewrite-target annotation
Suspicious data within the rules.http.paths.path field of an Ingress resource could indicate an attempt to exploit this vulnerability.
# Check for suspicious Ingress annotations
kubectl get ingress --all-namespaces -o json | \
jq '.items[] | select(.metadata.annotations["nginx.ingress.kubernetes.io/rewrite-target"] != null) | {namespace: .metadata.namespace, name: .metadata.name, rewrite: .metadata.annotations["nginx.ingress.kubernetes.io/rewrite-target"]}'
If you find evidence that this vulnerability has been exploited, contact [email protected].
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Date | Event |
|---|---|
| — | Vulnerability discovered and reported to Kubernetes Security Response Committee |
| March 9, 2026 | Security advisory published |
| March 9, 2026 | Patched versions released (1.13.8, 1.14.4, 1.15.0) |
| March 9, 2026 | CVE-2026-3288 assigned |
Researcher: Kai Aizen — SnailSploit
Acknowledgement: Tabitha Sable on behalf of the Kubernetes Security Response Committee
This information is provided for security research and defensive purposes only. Any exploitation of this vulnerability for malicious purposes is illegal and unethical. Always obtain proper authorization before testing systems you do not own.
For questions or additional information about this vulnerability:
Last updated: March 10, 2026
This project's full writeup, methodology, and related research lives at:
https://snailsploit.com/security-research/cves/cve-2026-3288/
Created by Kai Aizen — independent offensive security researcher.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Same attack. Different substrate.
| CVE | Year | Annotation | Impact |
|---|
| CVE-2021-25746 | 2022 | Various annotations | Directive injection |
| CVE-2023-5044 | 2023 | permanent-redirect | Code injection |
| CVE-2024-7646 | 2024 | Annotation validation bypass | Validation bypass |
| CVE-2026-3288 | 2026 | rewrite-target | RCE + Secret disclosure |
| 1.15.x | < 1.15.0 | 1.15.0 |
| Metric | Value |
|---|
| Attack Vector | Network (AV:N) |
| Attack Complexity | Low (AC:L) |
| Privileges Required | Low (PR:L) |
| User Interaction | None (UI:N) |
| Scope | Unchanged (S:U) |
| Confidentiality | High (C:H) |
| Integrity | High (I:H) |
| Availability | High (A:H) |