FlawOpen

flawopen.com/Teardowns/cve-2024-7646-ingress-nginx-annotation-code-injection

● CVE-2024-7646 · CVSS 8.8 · Hoch
Sicherheitsforschung · FlawOpen

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.

💡 Einfache Erklärung (ELI5)

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

Schritt 1

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.

Schritt 2

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.

Schritt 3

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.

Schritt 4

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.

VERWUNDBARE IMPLEMENTIERUNG
// 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
}
GEHÄRTETER SICHERHEITS-PATCH
// 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

Quellen