CVE-2025-10157 : contournement de l’analyse picklescan menant à une exécution de code arbitraire

picklescan est une bibliothèque open source populaire pour Python, conçue pour détecter et prévenir les vulnérabilités liées à la désérialisation non sécurisée dans le format pickle de Python. Elle est largement utilisée dans les pipelines de Machine Learning (ML) et d’Intelligence Artificielle (IA) pour analyser les modèles pré-entraînés à la recherche de code malveillant avant leur chargement, jouant un rôle fondamental en tant que contrôle de sécurité dans le cycle de vie MLOps. Toute application traitant des données sérialisées provenant de sources non fiables peut s’appuyer sur cet outil pour se protéger.

L’impact de cette vulnérabilité est critique. Elle représente un contournement complet du mécanisme de sécurité du scanner, le rendant inefficace. Un attaquant peut créer un fichier malveillant que l’outil certifie à tort comme « sûr » et qui, une fois chargé par une application en aval, conduit à une exécution de code à distance non authentifiée.

Un code d’exploitation public est disponible pour cette vulnérabilité et, compte tenu de sa nature de contournement d’un contrôle de sécurité, son exploitation active est hautement probable. Toute organisation utilisant des versions vulnérables de picklescan pour assainir des fichiers non fiables, en particulier celles intégrant des modèles ML tiers, est exposée à un risque immédiat de compromission du système.

Produitpicklescan
Date05-12-2025 12:14:05

Résumé technique

La vulnérabilité est due à un contrôle inadéquat des modules et des fonctions dangereuses au sein de la logique de validation unsafe_globals. La cause principale est une CWE-183 : Expression régulière permissive (ou un défaut logique similaire), où le scanner effectue une comparaison de chaînes exacte par rapport à une liste de blocage contenant des modules dangereux connus (ex. “asyncio”, “subprocess”), mais ne vérifie pas récursivement les sous-modules de ces paquets.

La chaîne d’attaque est la suivante :

  1. Un attaquant crée un fichier pickle malveillant contenant une charge utile qui invoque une fonction dangereuse à partir d’un sous-module d’un paquet bloqué (ex. asyncio.unix_events au lieu du paquet parent asyncio).
  2. La version vulnérable de picklescan analyse le fichier. Son scanner compare le module “asyncio.unix_events” avec sa liste de blocage interne.
  3. Comme la liste de blocage ne contient que l’entrée exacte “asyncio”, le contrôle ne détecte aucune correspondance et picklescan signale à tort le fichier malveillant comme sûr.
  4. Une application en aval, faisant confiance à la sortie du scanner, charge le fichier pickle via pickle.load().
  5. Le désérialiseur Python exécute la charge utile intégrée, accordant à l’attaquant l’exécution arbitraire de code avec les permissions du processus de l’application.

Versions affectées :

  • les versions de picklescan 0.0.30 et antérieures sont vulnérables.

Un exemple conceptuel de la logique erronée :

# Logique vulnérable (Conceptuelle)
def is_dangerous(module_name):
    blocklist = {"os", "subprocess", "asyncio"}
    return module_name in blocklist # Échoue pour "os.path"

# Logique corrigée (Conceptuelle)
def is_dangerous_fixed(module_name):
    blocklist = {"os", "subprocess", "asyncio"}
    # Vérifie si le module ou l'un de ses paquets parents est dans la liste de blocage
    parts = module_name.split('.')
    for i in range(len(parts)):
        sub_module = ".".join(parts[:i+1])
        if sub_module in blocklist:
            return True
    return False

Ce contournement mine complètement la garantie de sécurité offerte par la bibliothèque, permettant à un attaquant expérimenté de compromettre totalement le système.

Recommandations

  • Appliquer le correctif immédiatement : mettre à jour la bibliothèque picklescan vers une version supérieure à 0.0.30. Toutes les versions précédentes sont considérées comme vulnérables.
  • Atténuations : s’il n’est pas possible d’appliquer le correctif immédiatement, considérez tous les fichiers scannés par des versions vulnérables de picklescan comme non fiables. L’atténuation la plus efficace consiste à désactiver le chargement automatique des fichiers pickle ou des modèles ML provenant de sources non vérifiées ou non fiables.
  • Chasse et surveillance :
    • Re-scanner tous les fichiers pickle et modèles ML existants dans l’environnement avec une version corrigée du scanner.
    • Surveiller les journaux des applications à la recherche de comportements anormaux, d’erreurs lors de la désérialisation ou de la création imprévue de processus enfants (ex. shell, reverse shell) par des applications Python traitant des fichiers pickle.
    • Analyser le trafic réseau à la recherche de connexions sortantes inattendues provenant de serveurs hébergeant des modèles ML ou traitant des données.

  • Réponse aux incidents : en cas de suspicion de compromission, isoler immédiatement l’hôte concerné du réseau pour prévenir les mouvements latéraux. Conserver le fichier malveillant et les journaux système pour une analyse forensique. Lancer un protocole de rotation des identifiants pour tous les services s’exécutant sur la machine compromise ou accessibles depuis celle-ci.
  • Défense en profondeur : ne jamais désérialiser des données provenant de sources non fiables. Exécuter les applications traitant des données externes, comme les API de chargement de modèles ML, dans des environnements sandbox ou conteneurisés avec des privilèges minimaux et des filtres stricts sur le trafic sortant.

[Callforaction-THREAT-Footer]

Leave a Reply

Your email address will not be published. Required fields are marked *