Aller au contenu

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.

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.

  1. Militarisation : l’acteur de la menace crée une archive .nemo malveillante. Il insère une charge utile conçue pour écraser un module Python critique (comme une dépendance dans site-packages) en utilisant des séquences ../ dans l’en-tête tar.
  2. Distribution : le modèle empoisonné est téléversé sur une plateforme populaire (ex: HuggingFace) avec un nom attractif (ex: Llama3-NeMo-Uncensored).
  3. Ingestion : un développeur victime ou un pipeline CI/CD automatisé télécharge et initialise le modèle à l’aide du framework NeMo.
  4. 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.
  5. 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.

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 .py ou 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.
sigma_ai_python_shell_spawn.yaml
title: Shell Suspect Généré par Python/Framework IA
id: 8b1a3c4d-2e5f-4a6b-9c0d-1e2f3a4b5c6d
status: experimental
description: 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: linux
detection:
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_child
level: high
tags:
- attack.execution
- cve.2025-23304
  1. Application immédiate du correctif : mettez à jour le framework NVIDIA NeMo vers la version 2.3.2 ou ultérieure.
  2. Sandboxing des charges de travail IA : ne chargez jamais de modèles .nemo non fiables (ou des poids Pickle/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).
  3. Extraction sécurisée : pour les développeurs construisant des plateformes IA, assurez-vous que l’extraction tarfile de Python utilise le paramètre filter='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.