
Protection contre les attaques de sérialisation de modèles
Les modèles de Machine Learning (ML) sont partagés publiquement sur Internet, au sein des équipes et entre équipes. L'essor des modèles de fondation a conduit à une consommation croissante des modèles ML publics pour un entraînement ou un fine-tuning supplémentaire. Les modèles ML sont de plus en plus utilisés pour prendre des décisions critiques et alimenter des applications essentielles. Malgré cela, les modèles ne sont pas encore analysés avec la même rigueur qu'un fichier PDF dans votre boîte mail.
Cela doit changer, et des outils adaptés constituent la première étape.

ModelScan est un projet open source de Protect AI qui analyse les modèles afin de déterminer s'ils contiennent du code non sûr. C'est le premier outil d'analyse de modèles à prendre en charge plusieurs formats de modèles. ModelScan prend actuellement en charge les formats H5, Pickle et SavedModel. Cela vous protège lorsque vous utilisez PyTorch, TensorFlow, Keras, Sklearn, XGBoost, et d'autres formats sont à venir.
Si vous êtes prêt à commencer à analyser vos modèles, c'est simple :
pip install modelscan
Une fois installé, analysez un modèle :
modelscan -p /path/to/model_file.pkl
Les modèles sont souvent créés à partir de pipelines automatisés, tandis que d'autres peuvent provenir du portable d'un data scientist. Dans les deux cas, le modèle doit être transféré d'une machine à une autre avant d'être utilisé. Ce processus d'enregistrement d'un modèle sur disque est appelé sérialisation.
Une attaque de sérialisation de modèle consiste à ajouter du code malveillant au contenu d'un modèle pendant la sérialisation (l'enregistrement) avant sa distribution — une version moderne du cheval de Troie.
L'attaque fonctionne en exploitant le processus d'enregistrement et de chargement des modèles. Lorsque vous chargez un modèle avec model = torch.load(PATH), PyTorch ouvre le contenu du fichier et commence à exécuter le code qu'il contient. Dès l'instant où vous chargez le modèle, l'exploit est exécuté.
Une attaque de sérialisation de modèle peut être utilisée pour exécuter :
Ces attaques sont incroyablement simples à exécuter et vous pouvez voir des exemples fonctionnels dans notre dossier 📓notebooks.
ModelScan offre une analyse open source robuste. Si vous avez besoin d'une sécurité IA complète, pensez à Guardian. Il s'agit de notre produit d'analyse de modèles de niveau entreprise.

Si le chargement d'un modèle avec votre framework de machine learning exécute automatiquement l'attaque, comment ModelScan vérifie-t-il le contenu sans charger le code malveillant ?
Simple : il lit le contenu du fichier octet par octet, comme une chaîne de caractères, à la recherche de signatures de code non sûres. Cela le rend extrêmement rapide, analysant les modèles dans le temps que votre ordinateur met pour traiter la taille totale du fichier depuis le disque (quelques secondes dans la plupart des cas). C'est également sécurisé.
ModelScan classe le code non sûr selon les niveaux suivants :

Si un problème est détecté, contactez immédiatement les auteurs du modèle pour en déterminer la cause.
Dans certains cas, du code peut être intégré au modèle pour faciliter la reproduction des résultats par un data scientist, mais cela vous expose à une attaque. À vous de juger si cela est approprié pour vos charges de travail.
Cela sera étendu en continu, alors surveillez les changements dans nos notes de version.
À l'heure actuelle, ModelScan prend en charge tout format dérivé de Pickle et bien d'autres :
| Bibliothèque ML | API | Format de sérialisation | Support de modelscan |
|---|---|---|---|
| Pytorch | torch.save() et torch.load() | Pickle | Oui |
| Tensorflow | tf.saved_model.save() | Protocol Buffer | Oui |
| Keras | keras.models.save(save_format= 'h5') | HD5 (Hierarchical Data Format) | Oui |
| keras.models.save(save_format= 'keras') | Keras V3 (Hierarchical Data Format) | Oui | |
| Bibliothèques ML classiques (Sklearn, XGBoost, etc.) | pickle.dump(), dill.dump(), joblib.dump(), cloudpickle.dump() | Pickle, Cloudpickle, Dill, Joblib | Oui |
ModelScan s'installe sur vos systèmes en tant que package Python (Python 3.9 à 3.12 pris en charge). Comme indiqué ci-dessus, vous pouvez l'installer en exécutant cette commande dans votre terminal :
pip install modelscan
Pour l'inclure dans les dépendances de votre projet afin qu'il soit disponible pour tous, ajoutez-le à votre requirements.txt ou pyproject.toml comme ceci :
modelscan = ">=0.1.1"
Les scanners pour les modèles aux formats Tensorflow ou HD5 nécessitent une installation avec des extras :
pip install 'modelscan[ tensorflow, h5py ]'
ModelScan prend en charge les arguments suivants via la CLI :
| Usage | Argument | Explication |
|---|---|---|
modelscan -h | -h ou --help | Afficher l'aide d'utilisation |
modelscan -v | -v ou --version | Afficher les informations de version |
modelscan -p /path/to/model_file | -p ou --path | Analyser un modèle stocké localement |
modelscan -p /path/to/model_file --settings-file ./modelscan-settings.toml | --settings-file | Analyser un modèle stocké localement avec des configurations personnalisées |
modelscan create-settings-file | -l ou --location | Créer un fichier de paramètres configurable |
modelscan -r | -r ou --reporting-format | Format de la sortie. Les options sont console, json ou custom (à définir dans le fichier de paramètres). Par défaut : console |
modelscan -r reporting-format -o file-name | -o ou --output-file | Nom de fichier facultatif pour le rapport de sortie |
modelscan --show-skipped | --show-skipped | Afficher la liste des fichiers ignorés pendant l'analyse |
N'oubliez pas que les modèles sont comme toute autre forme de média numérique : vous devez analyser le contenu provenant de toute source non fiable avant de l'utiliser.
Les codes de sortie de la CLI sont :
0: Analyse terminée avec succès, aucune vulnérabilité trouvée1: Analyse terminée avec succès, des vulnérabilités ont été trouvées2: L'analyse a échoué, modelscan a renvoyé une erreur lors de l'analyse3: Aucun fichier pris en charge n'a été transmis à l'outil4: Erreur d'utilisation, la CLI a reçu des options invalides ou incomplètesBien que ModelScan puisse être facilement utilisé via la CLI, vous pouvez également l'intégrer directement dans vos applications ou workflows Python.
from modelscan.modelscan import ModelScan
from modelscan.settings import DEFAULT_SETTINGS
# Initialize ModelScan with default settings
scanner = ModelScan(settings=DEFAULT_SETTINGS)
# Scan a model file or directory
results = scanner.scan("/path/to/model_file.pkl")
# Check if issues were found
if scanner.issues.all_issues:
print(f"Found {len(scanner.issues.all_issues)} issues!")
# Access issues by severity
issues_by_severity = scanner.issues.group_by_severity()
for severity, issues in issues_by_severity.items():
print(f"{severity}: {len(issues)} issues")
# Generate a report (default is console output)
scanner.generate_report()
Vous pouvez personnaliser le comportement d'analyse avec vos propres paramètres :
# Start with default settings and customize
custom_settings = DEFAULT_SETTINGS.copy()
# Update settings as needed
custom_settings["reporting"]["module"] = "modelscan.reporting.json_report.JSONReport"
custom_settings["reporting"]["settings"]["output_file"] = "scan_results.json"
# Initialize with custom settings
scanner = ModelScan(settings=custom_settings)
Une fois l'analyse terminée, vous verrez une sortie comme celle-ci si un problème est trouvé :

Nous avons ici un modèle qui contient un opérateur non sûr pour ReadFile et WriteFile. Il est évident que nous ne voulons pas que nos modèles lisent et écrivent des fichiers de manière arbitraire. Nous contacterions alors le créateur de ce modèle pour déterminer ce qu'il attendait de ce comportement. Dans ce cas précis, cela permet à un attaquant de lire nos identifiants AWS et de les écrire ailleurs.
C'est un non catégorique pour l'utilisation.
L'analyse ad hoc est une excellente première étape. Faites-vous-en une habitude, ainsi que vos collègues et amis, à chaque fois qu'ils téléchargent un nouveau modèle à explorer. Cela ne suffit pas à améliorer la sécurité des processus MLOps en production.
L'analyse des modèles doit être effectuée plus d'une fois pour accomplir ce qui suit :
Les blocs rouges ci-dessous mettent en évidence ce point dans un pipeline ML traditionnel.

Les processus seraient les mêmes pour le fine-tuning ou toute modification de LLM, de modèles de fondation ou de modèles externes.
Intégrez des analyses dans les processus de déploiement de vos systèmes CI/CD pour sécuriser l'utilisation lors du déploiement des modèles, si cela est effectué en dehors de vos pipelines ML.
Dans le dossier 📓notebooks, vous pouvez explorer un certain nombre de notebooks qui illustrent exactement comment les attaques de sérialisation de modèles peuvent être menées contre divers frameworks ML comme TensorFlow et PyTorch.
Pour approfondir le fonctionnement exact de ces attaques, consultez 🖹 Explication des attaques de sérialisation de modèles.
Si vous rencontrez d'autres approches pour évaluer des modèles dans un contexte statique, n'hésitez pas à nous contacter, nous serions ravis d'en apprendre davantage !
Copyright 2024 Protect AI
Sous licence Apache, version 2.0 (la « Licence ») ; vous ne pouvez pas utiliser ce fichier sauf en conformité avec la Licence. Vous pouvez obtenir une copie de la Licence à l'adresse suivante :
http://www.apache.org/licenses/LICENSE-2.0
Sauf obligation prévue par la loi applicable ou accord écrit, le logiciel distribué sous la Licence est distribué sur une base « AS IS », SANS GARANTIES NI CONDITIONS D'AUCUNE SORTE, expresses ou implicites. Voir la Licence pour connaître les autorisations et les limitations spécifiques prévues par la Licence.
Nous avons été fortement inspirés par Matthieu Maitre qui a créé PickleScan. Nous apprécions ce travail et l'avons considérablement étendu avec ModelScan. ModelScan est publié en open source dans le même esprit que PickleScan.
Nous serions ravis de vous voir contribuer à notre projet open source ModelScan. Si vous souhaitez contribuer, veuillez suivre les détails sur la page Contribution.