Protéger contre l'exécution de code malveillant lors de l'utilisation de pickle
Lorsque vous utilisez pickle pour charger des objets, il existe un risque d’exécution de code malveillant si le fichier pickle provient d’une source non fiable. En effet, pickle peut exécuter du code pendant le processus de désérialisation. Pour vous protéger, il est essentiel de ne charger que des fichiers pickle provenant de sources de confiance. Une bonne pratique est de privilégier d’autres méthodes de sérialisation comme json ou yaml lorsque cela est possible, car elles sont généralement plus sûres. Si vous devez utiliser pickle, veillez à valider l’intégrité du fichier avant de le charger. Il est également recommandé d’utiliser des formats de sérialisation sécurisés, et d’éviter de désérialiser des objets venant de sources inconnues.
Fonctions :
-
Protéger contre l'exécution de code malveillant
Le module pickle est puissant pour la sérialisation et la désérialisation d'objets Python, mais il présente des risques de sécurité. Lors de la désérialisation d'un fichier pickle provenant d'une source non fiable, il est possible que du code malveillant soit exécuté. Cela peut compromettre la sécurité de votre système. Ce bloc détaille les risques liés à l'utilisation de pickle et propose des précautions pour limiter ces risques.
Attributs :
Risques de sécurité
-
Exécution de code malveillant :
pickle
peut exécuter des fonctions ou du code arbitraire lors de la désérialisation. Cela se produit lorsque des objets malveillants sont injectés dans un fichierpickle
et sont exécutés automatiquement lorsqu'ils sont chargés avecpickle.load()
. Un attaquant pourrait, par exemple, manipuler un fichier pour qu'il exécute des commandes système, vole des informations sensibles ou modifie des fichiers. -
Injection de données malveillantes :
Un fichierpickle
peut contenir des objets comme des classes personnalisées, et lorsqu'ils sont désérialisés, des méthodes ou des comportements malicieux peuvent être exécutés. -
Manipulation des objets sérialisés :
Commepickle
peut sérialiser et désérialiser des objets Python complexes (y compris des objets définis par l'utilisateur), des objets malicieux peuvent être injectés dans des fichiers pour exploiter des failles dans votre code.
Précautions à prendre
-
Ne jamais désérialiser des fichiers
pickle
provenant de sources non fiables
Évitez de désérialiser des fichierspickle
provenant d'internet, de messages non vérifiés, ou de toute source qui pourrait être compromise. Cela inclut des fichiers partagés via des emails, des forums, des API publiques, etc. -
Vérification des fichiers avant désérialisation
Si vous devez charger un fichierpickle
d'une source externe, il est essentiel de vérifier son intégrité et sa provenance avant d'exécuter la désérialisation. Vous pouvez également implémenter un système de vérification de la signature pour valider que le fichier n'a pas été modifié. -
Utiliser
pickle
dans un environnement contrôlé
Désérialisez les objets uniquement dans un environnement sécurisé et isolé. Par exemple, utilisez un environnement virtuel ou un conteneur Docker pour limiter les effets d'une éventuelle exécution malveillante. -
Utiliser des alternatives plus sûres
Si possible, évitez d'utiliserpickle
pour des fichiers externes ou partagés. Utilisez des alternatives comme :- JSON : Si les objets sont simples (par exemple des dictionnaires, des listes), vous pouvez utiliser
json
qui est plus sécurisé et largement compatible avec d'autres langages. - MessagePack : Une alternative binaire plus sécurisée que
pickle
qui est également plus rapide. - Protocol Buffers ou Avro : Des solutions robustes et sécurisées pour la sérialisation d'objets complexes.
- JSON : Si les objets sont simples (par exemple des dictionnaires, des listes), vous pouvez utiliser
-
Limiter l'accès aux ressources système
Si vous devez absolument utiliserpickle
, vous pouvez restreindre les accès système pendant le processus de désérialisation pour limiter les conséquences en cas d'attaque.
Exemple de protection avec un "safe"
pickle
Bien qu'il n'existe pas de méthode intégrée pour rendre
pickle
totalement sûr, vous pouvez utiliser une approche prudente en vérifiant que le fichier contient uniquement des objets sûrs. Par exemple, vous pourriez intercepter les classes ou objets lors de la désérialisation :Exemple de code :
import pickle # Une fonction pour désérialiser uniquement des objets sûrs def safe_load(filename): # Liste des classes autorisées allowed_classes = [str, int, float, list, dict] with open(filename, 'rb') as f: obj = pickle.load(f) # Vérification de la classe de l'objet désérialisé if not isinstance(obj, tuple(allowed_classes)): raise ValueError("Objet désérialisé non autorisé") return obj
Explication du code :
Conseils supplémentaires
-
Utilisation d'un mécanisme de vérification d'intégrité : Pour renforcer la sécurité, vous pouvez signer numériquement vos fichiers
pickle
pour vous assurer qu'ils n'ont pas été altérés. Par exemple, vous pourriez utiliserhashlib
pour générer une somme de contrôle du fichier avant et après la désérialisation. -
Audit de code : Si vous devez absolument utiliser
pickle
dans un projet, assurez-vous de procéder à un audit de sécurité pour identifier et corriger toute vulnérabilité. -
Surveillance : Si vous chargez fréquemment des fichiers
pickle
externes, mettez en place des systèmes de surveillance pour détecter des comportements suspects ou inattendus après la désérialisation des fichiers.
-