Aller au contenu
Cercle IA Tech · Open source Un site du réseau Cercle IA Tech

Guide

Sécurité d'un modèle téléchargé : safetensors et pickle

Pourquoi un fichier pickle peut exécuter du code, ce que garantit safetensors, le risque de trust_remote_code et les vérifications de provenance.

Mis à jour le

Un fichier de modèle n'est pas toujours une simple suite de nombres. Au format pickle, le format par défaut des poids PyTorch (souvent .bin ou .pt), charger le fichier peut exécuter du code arbitraire. Le format safetensors a été conçu pour stocker les poids sans ce risque. Les trois règles de base : préférer les fichiers .safetensors, télécharger depuis le compte de l'éditeur, et ne jamais activer le chargement de code distant sans l'avoir lu et figé sur une version.

Pourquoi pickle est dangereux

La documentation de Hugging Face sur l'analyse des fichiers pickle l'explique ainsi : un fichier pickle est une pile d'instructions qui sont exécutées au chargement. Certaines instructions permettent d'importer un module et d'appeler une fonction ; un fichier piégé peut donc appeler des fonctions Python comme eval ou exec et exécuter n'importe quel programme. D'où la consigne reprise dans la plupart des documentations : ne pas charger de fichier pickle venant d'une source non fiable.

Ce que fait safetensors

Safetensors est, selon sa documentation, un format simple pour stocker des tenseurs (les tableaux de nombres qui forment les poids) « de façon sûre (par opposition à pickle) » et rapide. La bibliothèque Transformers charge en priorité les fichiers safetensors quand ils existent, et sa documentation rappelle que pickle est « connu pour ne pas être sûr ». Safetensors est utilisé par de nombreux projets, dont Transformers, Diffusers, llama.cpp ou ComfyUI d'après la liste publiée.

En pratique, dans l'onglet des fichiers d'un dépôt, cherchez les fichiers model.safetensors ou model-00001-of-0000N.safetensors. Si un dépôt ne propose que des fichiers pickle, posez-vous la question avant de les charger.

Le code distant : trust_remote_code

Certains modèles utilisent un code d'architecture qui n'est pas dans Transformers. Pour les charger, il faut passer l'option trust_remote_code=True, qui exécute le code Python présent dans le dépôt. La documentation de Transformers demande une « précaution supplémentaire » : malgré l'analyse antivirus du Hub, il faut éviter d'exécuter par inadvertance du code malveillant. Elle recommande, comme couche de sécurité supplémentaire, de charger une révision précise (un identifiant de commit), pour éviter qu'un code modifié depuis votre vérification soit chargé.

Ce que le Hub vérifie, et ce qu'il ne vérifie pas

Vérification Ce qu'elle apporte Sa limite
Antivirus ClamAV sur chaque fichier envoyé Détecte des fichiers dangereux connus Ne couvre pas les attaques par pickle, selon la documentation
Analyse des imports des fichiers pickle Affiche la liste des imports à côté du fichier et signale les suspects « Pas infaillible à 100 % » : la vérification reste à la charge de l'utilisateur
Signature des commits par clé GPG Garantit qui a envoyé le fichier Ne garantit pas que le fichier est sain
Accès contrôlé (gated) L'éditeur sait qui télécharge Ne dit rien de la sûreté du fichier

Au-delà du fichier : la provenance

La note d'analyse de la CNIL sur l'open source en IA relève d'autres risques propres aux modèles diffusés librement : des contributions malveillantes qui chercheraient à empoisonner les modèles ou à y introduire des portes dérobées, et la facilité à supprimer ou contourner les filtres de sécurité d'un modèle par paramétrage ou ajustement. Un modèle republié par un tiers, même au format safetensors, peut avoir été modifié de cette façon. Pour les attaques par les données d'entraînement, voyez la page empoisonnement des données de Cercle IA Tech · Sécurité.

La liste de contrôle avant de charger un modèle

  1. Le compte : le dépôt appartient-il à l'éditeur (par exemple mistralai/, Qwen/, google/) ou à un tiers qui le republie ?
  2. Le format : des fichiers .safetensors sont-ils disponibles ? Sinon, quels imports le Hub affiche-t-il pour les fichiers pickle ?
  3. Le code : le chargement demande-t-il trust_remote_code=True ? Si oui, lisez le code et figez la révision.
  4. La version : notez l'identifiant de commit téléchargé, pour savoir exactement ce qui tourne chez vous.
  5. L'environnement : chargez d'abord le modèle dans un environnement isolé, sans accès à vos données ni à vos secrets.
  6. Le comportement : testez les garde-fous du modèle sur vos cas sensibles avant toute mise en service.

Pour choisir le modèle lui-même, voir lire une fiche de modèle.

Questions fréquentes

Un fichier .bin ou .pt peut-il contenir un programme malveillant ?

Oui s'il est au format pickle, le format par défaut des poids PyTorch. La documentation de Hugging Face explique que charger un fichier pickle peut exécuter du code arbitraire.

Le format safetensors est-il sûr ?

Hugging Face le présente comme un format simple pour stocker des tenseurs « de façon sûre », par opposition à pickle, tout en restant rapide. Il réduit le risque lié au fichier de poids, mais ne remplace pas la vérification de la provenance ni celle du code associé.

Sources

Pages consultées pour écrire cet article :

  1. https://huggingface.co/docs/hub/security-pickle
  2. https://huggingface.co/docs/safetensors/index
  3. https://huggingface.co/docs/transformers/models
  4. https://huggingface.co/docs/hub/models-gated
  5. https://www.cnil.fr/sites/cnil/files/2024-06/note_d_analyse_sur_les_pratiques_open_source_en_ia.pdf

À lire aussi