CVE-2025-23304 : RCE sur NVIDIA NeMo Framework
1. La menace de la chaîne d’approvisionnement IA (Supply Chain)
Section intitulée « 1. La menace de la chaîne d’approvisionnement IA (Supply Chain) »Dans l’ingénierie IA moderne, les chercheurs téléchargent fréquemment des poids et des modèles pré-entraînés depuis des dépôts publics pour les ajuster (fine-tuning) à l’aide de frameworks comme NVIDIA NeMo. Cela crée une vulnérabilité massive au niveau de la chaîne d’approvisionnement.
Comme détaillé dans nos recherches sur l’Empoisonnement des données d’entraînement, les adversaires n’ont plus besoin d’exploiter les périmètres réseau s’ils peuvent inciter un développeur à télécharger un artefact empoisonné. La CVE-2025-23304 militarise le format de fichier .nemo lui-même pour obtenir une compromission immédiate du système lors de la phase de chargement.
2. Analyse technique de la vulnérabilité
Section intitulée « 2. Analyse technique de la vulnérabilité »Le cœur de la vulnérabilité réside dans la manière dont le framework NeMo analyse et extrait le contenu d’un fichier .nemo.
Un fichier .nemo est essentiellement une archive compressée (similaire à un fichier .tar ou .zip) contenant les poids du réseau neuronal, des fichiers YAML de configuration et des métadonnées. Avant la version 2.3.2, le framework utilisait des méthodes d’extraction non sécurisées (comme tarfile.extractall sans le paramètre de sécurité filter='data' introduit dans les versions récentes de Python) lors du décompactage du modèle.
De la traversée de répertoire à la RCE (CWE-22 vers CWE-94)
Section intitulée « De la traversée de répertoire à la RCE (CWE-22 vers CWE-94) »Puisque le framework omet de valider les chemins de fichiers intégrés dans les en-têtes de l’archive, un attaquant peut concevoir un fichier .nemo contenant des entrées avec des séquences de traversée de répertoire (ex: ../../../../home/user/.bashrc ou ../../../../tmp/malicious.py).
Lorsque la victime exécute les fonctions de chargement standard de NeMo (ex: ModelPT.restore_from()), le framework extrait aveuglément les fichiers. L’attaquant peut ainsi écraser des scripts Python existants, des binaires système ou des fichiers de configuration sur la machine hôte. Si l’attaquant écrase un script Python que le framework importe par la suite, le code malveillant est exécuté avec les privilèges de l’environnement du data scientist.
3. Flux d’exploitation
Section intitulée « 3. Flux d’exploitation »- Militarisation : l’acteur de la menace crée une archive
.nemomalveillante. Il insère une charge utile conçue pour écraser un module Python critique (comme une dépendance danssite-packages) en utilisant des séquences../dans l’en-tête tar. - Distribution : le modèle empoisonné est téléversé sur une plateforme populaire (ex: HuggingFace) avec un nom attractif (ex:
Llama3-NeMo-Uncensored). - Ingestion : un développeur victime ou un pipeline CI/CD automatisé télécharge et initialise le modèle à l’aide du framework NeMo.
- Extraction et écrasement : la fonction vulnérable
restore_from()de NeMo extrait l’archive, déclenchant la traversée de répertoire et écrasant silencieusement le fichier Python cible. - Exécution de code : l’interpréte Python charge le module nouvellement écrasé, exécutant le reverse shell ou le script d’exfiltration de données de l’attaquant.
4. Investigation forensique (CSIRT)
Section intitulée « 4. Investigation forensique (CSIRT) »L’investigation des compromissions d’infrastructures IA nécessite d’aller au-delà des journaux de serveurs web traditionnels, en se concentrant plutôt sur les nœuds de calcul haute performance (HPC) et les environnements Jupyter Notebook.
- Filiation des processus : l’indicateur principal est un processus Python (ou un noyau Jupyter) générant soudainement des shells interactifs (
/bin/sh,bash) ou exécutant des utilitaires réseau (curl,wget). (Voir Analyse de l’historique shell Linux). - Anomalies du système de fichiers : recherchez sur le système de fichiers des modifications récentes de fichiers
.pyou de fichiers de démarrage cachés (.bashrc) qui coïncident avec l’horodatage du téléchargement ou de l’extraction d’un fichier.nemo. - Exfiltration réseau : les nœuds IA ont souvent accès à des ensembles de données massifs et sensibles. Surveillez les connexions sortantes des processus Python vers des IP inconnues.
5. Détection et Threat Hunting
Section intitulée « 5. Détection et Threat Hunting »title: Shell Suspect Généré par Python/Framework IAid: 8b1a3c4d-2e5f-4a6b-9c0d-1e2f3a4b5c6dstatus: experimentaldescription: Détecte les processus Python (couramment utilisés pour les frameworks IA comme NeMo ou PyTorch) générant des shells enfants suspects, indiquant une potentielle RCE via des modèles empoisonnés.logsource: category: process_creation product: linuxdetection: selection_parent: ParentImage|endswith: - '/python' - '/python3' - '/jupyter-notebook' selection_child: Image|endswith: - '/bin/sh' - '/bin/bash' - '/usr/bin/curl' - '/usr/bin/wget' condition: selection_parent and selection_childlevel: hightags: - attack.execution - cve.2025-23304# Recherche de processus Python écrivant des fichiers en dehors des répertoires /tmp/ ou des modèles attendusindex=os_logs sourcetype=linux_auditd action=created process="*python*"| search file_path="*/*" AND NOT (file_path="/tmp/*" OR file_path="/opt/models/*")| table _time, host, process, file_path, user| sort - _time6. Atténuation et architecture défensive
Section intitulée « 6. Atténuation et architecture défensive »- Application immédiate du correctif : mettez à jour le framework NVIDIA NeMo vers la version 2.3.2 ou ultérieure.
- Sandboxing des charges de travail IA : ne chargez jamais de modèles
.nemonon fiables (ou des poidsPickle/PyTorch) directement sur les machines hôtes. L’évaluation et l’inférence des modèles d’IA doivent se dérouler dans des conteneurs Docker éphémères, strictement isolés, sans autorisation de sortie réseau (sauf vers les API internes autorisées). - Extraction sécurisée : pour les développeurs construisant des plateformes IA, assurez-vous que l’extraction
tarfilede Python utilise le paramètrefilter='data'(disponible dans Python 3.12+) pour bloquer nativement les séquences de traversée de répertoire lors de la décompression d’archives.
Sources et références
Section intitulée « Sources et références »- Palo Alto Unit 42 : RCE Vulnerabilities in AI Python Libraries
- Ameeba Blog : NVIDIA NeMo Framework Vulnerability (CVE-2025-23304)
- Recherche liée : Empoisonnement des données d’entraînement et portes dérobées