flawopen.com/Teardowns/cve-2024-7646-ingress-nginx-annotation-code-injection
CVE-2024-7646: Ingress-NGINX-Validierungsumgehung
Ein Wagenrücklauf-Bypass ermöglichte Befehlsinjektion und Zugriff auf Controller-Zugangsdaten. Behoben in 1.11.2/1.10.4; Projekt eingestellt.
Stell dir einen Pförtner vor, der nur prüft, ob ein Formular ein erlaubtes Wort enthält, aber nicht den gesamten Wert validiert. Ein Wagenrücklauf kann ändern, wie das nächste System den restlichen Text liest. Hier bestand eine Annotation eine Teilzeichenfolgenprüfung und wurde danach in die erzeugte NGINX-Konfiguration geschrieben. Der Fix prüft den ganzen Wert und behandelt Wagenrückläufe sicher.
Kernkonzepte & Begriffe
Ingress-Objekt- Kubernetes-API-Ressource, die Routing von Host oder Pfad zu einem Service beschreibt. Nutzer können sie ohne Cluster-Admin-Rechte erstellen dürfen.
Umgehung der Annotationsprüfung- Ein Annotationswert bestand eine Prüfung, die eine erlaubte Teilzeichenfolge fand, ohne den gesamten Wert auf eine exakte erlaubte Option zu prüfen.
Wagenrücklauf (`\r`)- Steuerzeichen für einen Zeilenumbruch in manchen Formaten. Unterschiedliche Interpretation bei Prüfung und Konfigurationsgenerierung kann Zeilengrenzen verschieben.
ServiceAccount des Controllers- Kubernetes-Identität des ingress-nginx-Controllers. Laut Upstream-Hinweis kann sie in der Standardkonfiguration auf alle Cluster-Secrets zugreifen.
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-20
Ursachenanalyse
CVE-2024-7646 ist eine Umgehung der ingress-nginx-Annotationsprüfung und kein uneingeschränkter Lua-Snippet-Einsatz. Der Validator für auth-tls-verify-client verwendete einen Go-Regulärausdruck ohne Anfangs- und Endanker. MatchString konnte daher einen längeren Wert akzeptieren, der eine erlaubte Option nur als Teilstring enthielt. Ein Wagenrücklauf in der Annotation konnte beim Bereinigen der erzeugten NGINX-Konfiguration anschließend anders interpretiert werden. Der Upstream-Fix verlangt eine Übereinstimmung des gesamten Werts und behandelt einzelne Wagenrückläufe in cleanConf sicher. Laut Kubernetes-Sicherheitshinweis kann ein Akteur mit Berechtigung zum Erstellen von Ingress-Objekten die Prüfung umgehen, Befehle einschleusen und die Zugangsdaten des Controllers erlangen; in der Standardkonfiguration können diese alle Cluster-Secrets lesen. Dies ist ein authentifizierter Kubernetes-API-Pfad mit hoher Schwere (CVSS 8.8), keine anonyme Netzwerkanfrage. Das Projekt wurde im März 2026 eingestellt. Ein Update auf den historischen Fix ist nur eine Sofortmaßnahme; Installationen sollten zu einem gepflegten Controller oder einer Gateway-API-Implementierung migrieren.
Schritt-für-Schritt Angriffsablauf
Ein Nutzer darf ein Ingress erstellen
Der Angreifer benötigt Kubernetes-API-Rechte zum Erstellen eines Ingress-Objekts. Besonders betroffen sind Mandantencluster, die diese Berechtigung an Anwendungsteams delegieren.
Eine Annotation besteht eine Teilstring-Prüfung
Der verwundbare auth-tls-verify-client-Regulärausdruck hatte keine Anker. Go MatchString konnte daher einen längeren Wert mit einer erlaubten Option akzeptieren, statt den exakten Wert zu verlangen.
Der Wagenrücklauf überschreitet die Konfigurationsgrenze
Die Annotation fließt in die erzeugte NGINX-Konfiguration ein. Die Patchserie behebt sowohl die Prüfung des Gesamtwerts als auch den Umgang mit einzelnen Wagenrückläufen beim Bereinigen der Konfiguration.
Die Controller-Identität wird offengelegt
Der Kubernetes-Hinweis sagt, dass Befehlsinjektion Zugangsdaten des Controllers erlangen kann. Standardmäßig darf dieses ServiceAccount alle Secrets lesen; die Auswirkung hängt von den eingesetzten RBAC-Regeln ab.
Quellcode: Verwundbar vs. Sicher
Diese Ausschnitte stammen aus den Upstream-Fixes für CVE-2024-7646: PR #11719 verankert die erlaubten auth-tls-verify-client-Werte, PR #11721 behandelt einzelne Wagenrückläufe in cleanConf. Die 1.10-Linie erhielt die entsprechenden Änderungen in PR #11718 und #11722. Nicht relevanter Funktionskontext ist ausgelassen.
// internal/ingress/annotations/authtls/main.go (vorher)
authVerifyClientRegex = regexp.MustCompile(`on|off|optional|optional_no_ca`)
// internal/ingress/controller/template/template.go (vorher)
switch c {
case ' ', '\t':
needOutput = lineStarted
case '\n':
needOutput = !(!lineStarted && emptyLineWritten)
nextLineStarted = false
}
// internal/ingress/annotations/authtls/main.go (behoben)
authVerifyClientRegex = regexp.MustCompile(`^(on|off|optional|optional_no_ca)$`)
// internal/ingress/controller/template/template.go (behoben)
switch c {
case '\r':
rest := in.Bytes()
if len(rest) > 0 && rest[0] != '\n' {
c = ' '
needOutput = lineStarted
}
case '\n':
needOutput = !(!lineStarted && emptyLineWritten)
nextLineStarted = false
}
Checkliste für Engineering & Systemsicherheit
- ✓Beschränke per Kubernetes-RBAC, wer Ingress-Objekte erstellen oder ändern darf, insbesondere in Mandantenclustern; Nutzer mit diesem Recht erreichten den verwundbaren Pfad.
- ✓Zur historischen Eindämmung: Aktualisiere auf ingress-nginx 1.11.2 oder neuer in der 1.11-Linie oder 1.10.4 oder neuer in der 1.10-Linie. Prüfe das genaue Anbieter-Image und Chart.
- ✓Durchsuche Kubernetes-Auditlogs nach Ingress-Annotationen mit Wagenrückläufen (
\r), darunternginx.ingress.kubernetes.io/auth-tls-verify-client, wie im Upstream-Hinweis empfohlen. - ✓Betrachte
allow-snippet-annotations: "false"nicht als Fix für diese CVE: Betroffen waren Annotationsprüfung und Zeilenbehandlung, nicht nur die optionale Snippet-Funktion. - ✓Ingress NGINX wurde im März 2026 eingestellt. Plane die Migration zu einem gepflegten Controller oder Gateway API; der historische Fix bringt keine künftigen Sicherheitsupdates.
Quellen
- Kubernetes Security Response — CVE-2024-7646: Umfang, Versionen, Erkennung und Abhilfe
- Upstream-Fix — auth-tls-verify-client-Werte verankern (PR #11719)
- Upstream-Fix — Wagenrückläufe in erzeugter Konfiguration bereinigen (PR #11721)
- NVD — CVE-2024-7646
- Kubernetes — Einstellung von Ingress NGINX und Migrationshinweise
- MITRE CWE-20 — unzureichende Eingabevalidierung