AI Hacking - Comment les pirates utilisent l'intelligence artificielle dans les cyberattaques

Lire la suite
Nous utilisons l'intelligence artificielle pour les traductions de sites et, bien que nous nous efforcions d'être précis, il se peut que les traductions ne soient pas toujours exactes à 100 %. Nous vous remercions de votre compréhension.

IngressNightmare : CVE-2025-1974 Vulnérabilité et remédiation d'exécution de code à distance

par OPSWAT
Partager cet article

Le mois de mai 2025 a marqué la divulgation publique d'une vulnérabilité de sécurité critique, CVE-2025-1974, surnommée IngressNightmare, affectant le contrôleur Kubernetes ingress-nginx largement déployé dans les infrastructures natives du cloud. Cette vulnérabilité permet à des attaquants non authentifiés d'injecter des configurations arbitraires dans NGINX, ce qui peut potentiellement conduire à une exécution de code à distance (RCE) non autorisée et à la compromission complète du cluster.

Dans le cadre du programme de bourses OPSWAT , nos boursiers ont effectué une analyse technique approfondie afin de mieux comprendre la cause première, la voie d'exploitation et les stratégies d'atténuation de ce problème d'une grande gravité.

Vue d'ensemble de CVE-2025-1974 

CVE-2025-1974 est une vulnérabilité critique d'injection de modèle identifiée dans les versions d'ingress-nginx jusqu'à 1.11.4 et plus particulièrement 1.12.0. Les attaquants ayant un accès de niveau nœud à un cluster Kubernetes peuvent exploiter cette faille pour exécuter du code arbitraire par RCE via le contrôleur ingress-nginx qui, par défaut, dispose de privilèges étendus, y compris l'accès à des secrets critiques au sein du cluster.

Le Comité de Réponse à la Sécurité de Kubernetes a attribué à cette vulnérabilité un score CVSS v3.1 de 9.8 (gravité critique) :

CVSS metrics UI for CVE-2025-1974 showing exploitability and impact options for IngressNightmare (en anglais)

Principaux éléments de cette analyse

Aperçu de Kubernetes

Kubernetes (K8s) est une plateforme open-source permettant d'automatiser le déploiement, la mise à l'échelle et la gestion opérationnelle des applications conteneurisées. Les clusters Kubernetes se composent généralement de plusieurs machines, qui peuvent inclure à la fois du matériel physique et des machines virtuelles, travaillant collectivement pour fournir des environnements d'application hautement disponibles, évolutifs et gérables.

Contrôleur d'entrée NGINX

Le contrôleur d'entrée NGINX (ingress-nginx) est un contrôleur d'entrée open-source construit au-dessus du serveur web NGINX. Il fonctionne au sein d'un cluster Kubernetes, fonctionnant principalement comme un proxy inverse et un équilibreur de charge. Ce contrôleur interprète les ressources Ingress définies par les utilisateurs et les traduit en configurations NGINX exploitables pour acheminer le flux de trafic vers et au sein du cluster.

L'examen d'admission et son rôle

Ingress-nginx s'intègre à Kubernetes à l'aide d'un service webhook appelé AdmissionReview. Ce service est essentiel pour traiter les objets Ingress natifs de Kubernetes et les traduire en configurations NGINX validées et syntaxiquement correctes. Bien qu'AdmissionReview garantisse l'exactitude de la configuration, il fonctionne indépendamment du contrôleur ingress-nginx et ne dispose généralement pas de contrôles d'authentification stricts. Ce manque d'authentification stricte est un facteur clé qui a contribué à l'exploitabilité de CVE-2025-1974.

CVE-2025-1974 (IngressNightmare) diagramme montrant AdmissionReview dans le flux de travail du contrôleur Kubernetes Ingress NGINX

Exploitation des vulnérabilités et analyse technique

Mécanisme d'exploitation

L'exploitation de CVE-2025-1974 commence par une requête malveillante. Les attaquants créent une requête malveillante vers le webhook AdmissionReview, forçant NGINX à charger dynamiquement une bibliothèque partagée au moment de l'exécution. Sur la base de ce mécanisme, nos collègues ont analysé à la fois le webhook AdmissionReview et le flux de travail de NGINX pour comprendre ce chemin d'exploitation.

CVE-2025-1974 (IngressNightmare) diagramme montrant le chemin d'exploitation de Kubernetes via un objet d'entrée malveillant et NGINX

Vulnérabilité de l'injection de modèles

Sur le webhook AdmissionReview, lors du traitement des demandes entrantes, la fonction CheckIngress transforme les objets Ingress de Kubernetes en fichiers de configuration NGINX valides. Le flux se déroule comme suit :

Extrait de code Go montrant la logique d'injection de modèle liée à la vulnérabilité CVE-2025-1974 (IngressNightmare)
  1. Chaque configuration est analysée et transmise à generateTemplate pour être formatée selon les modèles NGINX prédéfinis.
  2. Ensuite, testTemplate valide la configuration générée par rapport au binaire NGINX sous-jacent.

Toutes les configurations NGINX sont basées sur des modèles prédéfinis qui se trouvent dans le fichier nginx.tmpl du code source d'ingress-nginx :

Extrait de code montrant une vulnérabilité par injection de modèle liée à CVE-2025-1974 (IngressNightmare)

Dans la fonction generateTemplate, la configuration est traitée comme indiqué dans l'extrait de code suivant :

Extrait de code Go montrant la logique d'analyse des annotations liée à l'injection de modèle CVE-2025-1974 (IngressNightmare)

Cependant, la validation et l'assainissement des entrées sont insuffisants. Plus précisément, le champ uid d'un objet Ingress est directement inséré dans le modèle de configuration NGINX, créant ainsi un point d'injection. Un attaquant peut exploiter ce point en fournissant une entrée élaborée telle que uid="1234#;\n\n}\n}\n}\n injection_value".

Cette entrée malveillante permet l'injection de portée globale dans le modèle NGINX, ce qui permet aux attaquants de déclencher des directives NGINX arbitraires et d'obtenir potentiellement un RCE.

Code de configuration de Nginx montrant une injection de modèle liée à la vulnérabilité CVE-2025-1974 (IngressNightmare)

De l'injection de modèle à l'exécution de code à distance

Explication de la fonction testTemplate()

Une fois la configuration NGINX générée par la fonction generateTemplate, la fonction testTemplate crée un fichier de configuration temporaire et exécute la bibliothèque NGINX à l'aide de la commande nginx -c {fichier_config}. -t. Cela oblige le binaire NGINX à analyser et à valider la configuration.

Code Go pour la fonction testTemplate() et les interfaces liées à la vulnérabilité CVE-2025-1974 (IngressNightmare)

Pour exploiter la vulnérabilité, un attaquant doit identifier une directive capable d'exécuter un code malveillant. Initialement, nos collègues ont identifié la directive load_module comme potentiellement utile, car cette directive permet à NGINX de charger des plugins externes. Cependant, cette directive n'est autorisée que dans la première phase de l'analyse de la configuration, ce qui ne correspond pas à notre point d'injection.

Capture d'écran du code montrant la syntaxe et le contexte de load_module, en rapport avec CVE-2025-1974 (IngressNightmare)
Sortie du terminal montrant l'échec du test de configuration de nginx lié à l'erreur load_module de CVE-2025-1974 (IngressNightmare)

Pour résoudre ce problème, nous avons poursuivi nos recherches, qui ont abouti à la directive ssl_engine, décrite comme "Le module peut être chargé dynamiquement par OpenSSL pendant les tests de configuration". Cette directive a suscité la curiosité en raison de sa capacité à charger dynamiquement des modules, ce qui a nécessité un examen plus approfondi.

Capture d'écran du code expliquant la syntaxe du dispositif ssl_engine dans le contexte de la CVE-2025-1974 (IngressNightmare)

Comprendre la directive ssl_engine

Pour mieux comprendre comment NGINX gère la directive ssl_engine et déterminer les conditions dans lesquelles NGINX autorise le chargement dynamique de modules supplémentaires via cette directive, nous avons consulté le code source de NGINX.

Extrait de code C montrant l'analyse de la configuration de NGINX, en rapport avec la directive ssl_engine de la CVE-2025-1974 (IngressNightmare)

Au démarrage, NGINX charge son état initial, puis analyse les fichiers de configuration ligne par ligne. Chaque directive est gérée par la structure nginx_command_t, la directive ssl_engine invoquant directement les ngx_openssl_commands.

Définition de la structure C pour ngx_command_s liée à la directive ssl_engine de la CVE-2025-1974 (IngressNightmare)
Figure 1. Définition de ngx_command_s
Extrait de code montrant le tableau de directives ssl_engine, dans le contexte de la CVE-2025-1974 (IngressNightmare)
Figure 2 Structure ssl_engine ngx_command_t

En analysant la fonction ngx_openssl_commands, nos collègues ont découvert qu'elle s'appuie sur le support OpenSSL, en particulier la fonction ENGINE_by_id qui est utilisée pour les modules SSL à accélération matérielle.

Extrait de code C montrant la logique de la directive ssl_engine, pertinente pour l'analyse de la CVE-2025-1974 (IngressNightmare)

En analysant la fonction ENGINE_by_id, nous avons constaté qu'elle permet le chargement dynamique des bibliothèques partagées. De plus, si la bibliothèque est compilée avec l'extension __attribute__((constructor)), la fonction associée peut être exécutée immédiatement après le chargement. Ceci indique qu'en exploitant la directive ssl_engine, un attaquant pourrait charger des bibliothèques partagées arbitraires sur l'hôte, conduisant potentiellement à un RCE.

Ciblage des bibliothèques partagées et stratégie d'attaque

Pour faciliter l'exécution du code de manière fiable, l'étape suivante consiste à identifier une bibliothèque partagée. Plutôt que de s'appuyer sur des bibliothèques externes, une approche plus viable et contrôlée émerge du comportement même de NGINX : le mécanisme de tampon du corps du client. Cette fonctionnalité permet à NGINX de décharger les requêtes entrantes volumineuses dans des fichiers temporaires, ce qui ouvre des possibilités d'exploitation basées sur un comportement prévisible en matière de traitement des fichiers.

Code nginx.conf montrant les chemins temporaires et les paramètres de la mémoire tampon, pertinent pour l'attaque CVE-2025-1974 (IngressNightmare)

Par défaut, lorsqu'une requête entrante dépasse 8 Ko, NGINX écrit le corps de la requête dans un fichier temporaire situé dans /tmp/nginx/client-body, en utilisant un nom de fichier au format cfg-{valeur_aléatoire}. Ces fichiers temporaires sont conservés jusqu'à 60 secondes entre les morceaux réussis d'un message reçu.

CVE-2025-1974 (IngressNightmare) : diagramme montrant le flux d'attaque ciblant les bibliothèques partagées et les fichiers temporaires de NGINX

Après avoir écrit un corps de requête partiel dans un fichier temporaire, NGINX reporte la suppression jusqu'à ce que le corps entier soit reçu. Si la requête reste incomplète et qu'aucune donnée n'est reçue pendant 60 secondes, le fichier est finalement purgé. Cependant, en retenant intentionnellement le dernier morceau de données, un attaquant peut maintenir le fichier temporaire en usage, le rendant ainsi exploitable.

Diagramme montrant le flux de l'attaque CVE-2025-1974 (IngressNightmare) ciblant les bibliothèques partagées NGINX et la suppression de fichiers

Bien que le contenu du fichier téléchargé puisse être contrôlé, il est difficile de le localiser sur le système de fichiers en raison du nom de fichier aléatoire. Le chemin de stockage peut être configuré à l'aide de client_body_temp_path, mais le nom de fichier est généré aléatoirement au moment de l'exécution, ce qui le rend imprévisible. Ce caractère aléatoire entrave considérablement l'accès ciblé, même par force brute. Pour y remédier, l'équipe a exploité des comportements inhérents au système d'exploitation Linux. Prenons l'exemple suivant :

Code Python exploitant la CVE-2025-1974 (IngressNightmare) avec écriture de fichier et logique de boucle infinie

This code opens a file and keeps it in an active state, closely mimicking the behavior of NGINX's client body buffer mechanism. Using /proc/{pid}/fd directory, attackers can find symbolic links created by the Linux kernel that map open file descriptors to their corresponding file paths. This route allows attackers to reduce the brute-force space to only two variables: the process ID (pid) and the file descriptor (fd).

Sortie du terminal montrant les détails du processus et du descripteur de fichier relatifs à la stratégie d'attaque CVE-2025-1974 (IngressNightmare)

Simuler l'exploitation

Sur la base de l'analyse ci-dessus, une approche pratique de l'exploitation du RCE dans le pod Ingress-NGINX est la suivante :

  1. Télécharger une bibliothèque partagée malveillante en utilisant le mécanisme de tampon du corps du client de NGINX pour la stocker temporairement sur le système de fichiers.
  2. Utiliser l'injection de modèle pour initier une tentative de force brute qui force NGINX à charger la bibliothèque partagée précédemment téléchargée via des directives vulnérables.
Schéma d'exploitation VE-2025-1974 (IngressNightmare) montrant le chemin de l'attaque à travers Ingress-NGINX jusqu'à NGINX

Élaboration de la charge utile contenant la bibliothèque partagée

Pour garantir l'exécution du code lors du chargement, une fonction de point d'entrée avec extension de constructeur est définie dans la bibliothèque partagée malveillante. Cette fonction est exécutée au chargement par NGINX et est conçue pour établir une connexion shell inversée avec un hôte distant. 

Code C pour le chargement de la CVE-2025-1974 (IngressNightmare) avec une bibliothèque partagée et une commande de reverse shell

Après compilation, la taille de la bibliothèque partagée résultante dépassait largement les 8 Ko, ce qui lui permettait d'être mise en mémoire tampon par NGINX sans nécessiter de rembourrage supplémentaire.

Liste de terminaux montrant la bibliothèque partagée danger.so pour la création de la charge utile CVE-2025-1974 (IngressNightmare)

Nos collègues ont ensuite élaboré une requête avec une valeur de longueur de contenu gonflée (par exemple, 1 Mo) afin d'introduire un décalage de taille. NGINX a alors mis en mémoire tampon l'ensemble du corps de la requête au lieu de le traiter immédiatement, ce qui a permis d'écrire l'objet partagé à un emplacement prévisible.

Code Go pour la création d'une charge utile avec une bibliothèque partagée, liée à l'exploit CVE-2025-1974 (IngressNightmare)

Déclenchement de la bibliothèque partagée par injection

Avec la bibliothèque partagée en place, nous avons ensuite injecté une directive malveillante dans la configuration de NGINX en utilisant le champ uid vulnérable. Cette directive incluait ssl_engine qui pointait vers le chemin du fichier tamponné :

Code JSON montrant l'objet Ingress de Kubernetes avec injection pour l'exploit CVE-2025-1974 (IngressNightmare)

Pour que le RCE réussisse, il faut que la directive ssl_engine fasse référence au chemin d'accès correct au fichier mis en mémoire tampon. Cela peut être réalisé par un script automatisé de force brute qui itère systématiquement sur les combinaisons possibles d'ID de processus et de descripteurs de fichiers pour identifier le lien symbolique valide pointant vers l'objet partagé mis en mémoire tampon.

Code Go exploitant la CVE-2025-1974 (IngressNightmare) via l'injection d'une bibliothèque partagée et la validation d'un webhook

Vous trouverez ci-dessous un exemple du modèle NGINX généré qui a déclenché l'exploit.

Code de configuration de Nginx montrant l'injection de la CVE-2025-1974 (IngressNightmare) via les directives ssl_engine et mirror

En cas d'exploitation réussie, l'attaquant peut obtenir un accès shell dans le contexte du pod ingress-nginx, qui par défaut a accès aux secrets sensibles du cluster Kubernetes.

Sortie du terminal montrant la commande kubectl get secrets -A, en rapport avec CVE-2025-1974 (IngressNightmare)

Atténuation et remédiation

Pour atténuer efficacement les risques associés à CVE-2025-1974, les entreprises ont besoin d'une solution qui offre une visibilité et un contrôle sur leurs composants open-source.

OPSWAT SBOM, une technologie fondamentale de la plateforme MetaDefender®, répond à ce besoin en fournissant un inventaire de tous les composants logiciels, bibliothèques, conteneurs Docker et dépendances utilisés. Il permet aux organisations de suivre, sécuriser et mettre à jour leurs composants de manière proactive.

Capture d'écran de l'interface utilisateur montrant la vulnérabilité critique CVE-2025-1974 (IngressNightmare) dans nginx-ingress-controller

Dans l'exemple ci-dessus, la technologie SBOM de MetaDefender Core™ a analysé le paquet nginx-ingress-controller qui contenait la vulnérabilité CVE-2025-1974. Le système a automatiquement signalé le problème comme étant critique et a fourni des indications sur les versions corrigées disponibles, ce qui a permis aux équipes de hiérarchiser et de corriger rapidement la vulnérabilité avant qu'elle ne puisse être exploitée.

OPSWAT SBOM est disponible dans MetaDefender Core et MetaDefender Software Supply Chain™, permettant aux équipes de sécurité d'identifier les vulnérabilités et d'agir plus rapidement. Avec OPSWAT SBOM, les équipes de sécurité peuvent :

  • Localiser rapidement les composants vulnérables - Identifier immédiatement les composants open-source affectés par les attaques de désérialisation. Cela permet d'agir rapidement en apportant des correctifs ou en remplaçant les bibliothèques vulnérables. 
  • Assurer des correctifs et des mises à jour proactifs - Surveiller en permanence les composants open-source grâce à OPSWAT SBOM pour rester à l'affût des vulnérabilités liées à la désérialisation. OPSWAT SBOM peut détecter les composants obsolètes ou non sécurisés, ce qui permet d'effectuer des mises à jour en temps voulu et de réduire l'exposition aux attaques. 
  • Maintenir la conformité et le reporting - OPSWAT OM aide les organisations à répondre aux exigences de conformité, car les cadres réglementaires imposent de plus en plus de transparence dans les chaînes d'approvisionnement en logiciels.
Tags :

Restez à jour avec OPSWAT!

Inscrivez-vous dès aujourd'hui pour recevoir les dernières mises à jour de l'entreprise, de l'entreprise, des histoires, des informations sur les événements, et plus encore.