flawopen.com/Teardowns/cve-2024-7646-ingress-nginx-annotation-code-injection
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.
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
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.
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.
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.
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.
// 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
}
// 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
- ✓Restringe el permiso RBAC para crear o editar Ingress, sobre todo en clústeres multiinquilino; usuarios con ese permiso podían alcanzar la ruta vulnerable.
- ✓Como contención histórica, actualiza ingress-nginx a 1.11.2 o posterior de la rama 1.11, o a 1.10.4 o posterior de la rama 1.10. Comprueba la imagen y el chart exactos del proveedor.
- ✓Revisa los registros de auditoría de Kubernetes para encontrar anotaciones Ingress con retornos de carro (
\r), incluidanginx.ingress.kubernetes.io/auth-tls-verify-client, tal como indica el aviso upstream. - ✓No consideres
allow-snippet-annotations: "false"una corrección de esta CVE: la ruta afectada era la validación de anotaciones y el tratamiento de líneas, no solo la función opcional de snippets. - ✓Ingress NGINX se retiró en marzo de 2026. Planifica la migración a un controlador mantenido o a Gateway API; el parche histórico no ofrece futuras actualizaciones de seguridad.
Fuentes
- Respuesta de seguridad de Kubernetes — CVE-2024-7646: alcance, versiones, detección y mitigación
- Parche upstream — anclar valores de auth-tls-verify-client (PR #11719)
- Parche upstream — limpiar retornos de carro de la configuración generada (PR #11721)
- NVD — CVE-2024-7646
- Kubernetes — retirada de Ingress NGINX y guía de migración
- MITRE CWE-20 — validación de entrada incorrecta