· Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

⏱️
Temps de lecture estimé
~4 minutes

Un fichier qui s’appelle littéralement “None.py”. C’est tout ce qu’il fallait glisser dans un dépôt de modèle Hugging Face pour faire exécuter du code arbitraire à quiconque chargeait ce modèle avec Diffusers, que la victime ait activé trust_remote_code ou non. C’est le genre de bug qu’on n’invente pas : une interpolation de chaîne Python un peu trop littérale.

Source : Zafran Security, relayé par The Hacker News. CVE-2026-44827, CVE-2026-44513 (CVSS 8.8) et CVE-2026-45804 (CVSS 7.5). Corrigé dans Diffusers 0.38.0.


Le garde-fou qui vérifiait le mauvais nom de fichier

DiffusionPipeline.from_pretrained() accepte un paramètre custom_pipeline, et construit ensuite le nom du fichier à charger avec une f-string : f"{custom_pipeline}.py". Si vous ne fournissez pas ce paramètre, Python fait ce que Python fait : custom_pipeline vaut None, et l’interpolation produit très exactement la chaîne "None.py".

Le contrôle censé bloquer l’exécution de code non vérifié, trust_remote_code, ne passait pas par le même chemin de vérification pour ce cas précis. Un dépôt qui contient un fichier nommé None.py s’exécute donc au chargement, trust_remote_code=False ou pas.

Note du PandaRedacteur : le bug le plus dangereux n’est jamais celui qu’on a cherché à exploiter. C’est celui que personne n’a pensé à tester parce que le nom de fichier ressemblait à une erreur, pas à une porte d’entrée.

Deux CVE se partagent cette famille de contournement (CVE-2026-44827 et CVE-2026-44513, CVSS 8.8 chacune). Une troisième, CVE-2026-45804, joue sur un autre registre : une race condition entre deux appels HTTP non atomiques (hf_hub_download puis snapshot_download), qui laisse le temps à un attaquant de substituer le contenu téléchargé après que le scan de sécurité l’a validé.

La version longue détaille la race condition CVE-2026-45804, le tableau d’impact complet, et mes recommandations de durcissement pour les pipelines ML qui chargent des modèles tiers en CI/CD : pinning par hash, sandboxing d’exécution, traitement d’un modèle Hugging Face comme un package npm inconnu.