FlawOpen

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

● CVE-2024-7646 · CVSS 8.8 · Alta
Investigación · FlawOpen

CVE-2024-7646: bypass de validación en Ingress-NGINX

Un bypass por retorno de carro permitía inyectar comandos y acceder a credenciales del controlador. Corregido en 1.11.2/1.10.4; proyecto retirado.

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagina a un guardia que comprueba si un formulario contiene una palabra permitida, pero no valida el valor completo. Un retorno de carro puede cambiar cómo el siguiente sistema interpreta el texto restante. Aquí una anotación superó una coincidencia parcial y luego se escribió en la configuración NGINX generada. La corrección valida el valor completo y trata los retornos de carro de forma segura.

Conceptos Clave y Términos

Objeto Ingress
Recurso de la API de Kubernetes que describe el enrutamiento desde un host o ruta hasta un Service. Algunos usuarios pueden crearlo sin ser administradores del clúster.
Bypass de validación de anotaciones
El valor de una anotación pasó un validador que encontró una subcadena permitida, sin exigir que coincidiera el valor completo.
Retorno de carro (`\r`)
Carácter de control usado como salto de línea en ciertos formatos. Si la validación y la generación de configuración lo interpretan de forma distinta, puede cambiar dónde empieza una línea.
Service account del controlador
Identidad de Kubernetes usada por el controlador ingress-nginx. El aviso upstream indica que, en la configuración predeterminada, sus permisos pueden permitir leer todos los Secrets del clúster.

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-20

Análisis de Causa Raíz

CVE-2024-7646 es un bypass de validación de anotaciones de ingress-nginx, no el uso irrestricto de un snippet Lua personalizado. El validador de auth-tls-verify-client usaba una expresión regular Go sin anclas de inicio y fin; por ello, MatchString podía aceptar un valor mayor que contuviera una opción válida como subcadena. Un retorno de carro en la anotación podía interpretarse de forma distinta al limpiar la configuración NGINX generada. La corrección upstream exige que coincida el valor completo y maneja de forma segura los retornos de carro aislados en cleanConf. El aviso de seguridad de Kubernetes indica que alguien con permiso para crear Ingress puede eludir la validación, inyectar comandos y obtener las credenciales del controlador; en la configuración predeterminada estas pueden leer todos los Secrets del clúster. Es una ruta autenticada por la API de Kubernetes y de gravedad alta (CVSS 8.8), no una petición anónima desde la red. El proyecto se retiró en marzo de 2026; actualizar a la corrección histórica solo contiene el riesgo de inmediato. Las instalaciones deben migrar a un controlador mantenido o a una implementación de Gateway API.

Flujo de Ataque Paso a Paso

Paso 1

Un usuario puede crear un Ingress

El atacante necesita permiso en la API de Kubernetes para crear un objeto Ingress. El riesgo es mayor en clústeres multiinquilino que delegan ese permiso a equipos de aplicaciones.

Paso 2

Una anotación supera una coincidencia parcial

La expresión regular vulnerable de auth-tls-verify-client no tenía anclas. Por eso Go MatchString podía aceptar un valor largo que contuviera una opción válida, en vez de exigir el valor exacto.

Paso 3

El retorno de carro cruza el límite de configuración

La anotación se incorpora a la configuración NGINX generada. La serie de parches corrige tanto la validación del valor completo como el tratamiento de retornos de carro aislados al limpiar la configuración.

Paso 4

Queda expuesta la identidad del controlador

El aviso de Kubernetes dice que la inyección de comandos puede obtener las credenciales del controlador. En la configuración predeterminada, esa service account puede leer todos los Secrets; el impacto depende del RBAC desplegado.

Código Fuente: Vulnerable vs. Seguro

Estos fragmentos proceden de las correcciones upstream de CVE-2024-7646: la PR #11719 ancla los valores permitidos de auth-tls-verify-client y la PR #11721 maneja retornos de carro aislados en cleanConf. La rama 1.10 recibió los cambios correspondientes en las PR #11718 y #11722. Se omite lógica circundante no relevante.

IMPLEMENTACIÓN VULNERABLE
// internal/ingress/annotations/authtls/main.go (antes)
authVerifyClientRegex = regexp.MustCompile(`on|off|optional|optional_no_ca`)

// internal/ingress/controller/template/template.go (antes)
switch c {
case ' ', '\t':
    needOutput = lineStarted
case '\n':
    needOutput = !(!lineStarted && emptyLineWritten)
    nextLineStarted = false
}
PARCHE SEGURO Y ROBUSTO
// internal/ingress/annotations/authtls/main.go (corregido)
authVerifyClientRegex = regexp.MustCompile(`^(on|off|optional|optional_no_ca)$`)

// internal/ingress/controller/template/template.go (corregido)
switch c {
case '\r':
    rest := in.Bytes()
    if len(rest) > 0 && rest[0] != '\n' {
        c = ' '
        needOutput = lineStarted
    }
case '\n':
    needOutput = !(!lineStarted && emptyLineWritten)
    nextLineStarted = false
}

Lista de Verificación de Seguridad para Ingeniería

Fuentes