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é

    1. 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 fichier pickle et sont exécutés automatiquement lorsqu'ils sont chargés avec pickle.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.

    2. Injection de données malveillantes :
      Un fichier pickle 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.

    3. Manipulation des objets sérialisés :
      Comme pickle 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

    1. Ne jamais désérialiser des fichiers pickle provenant de sources non fiables
      Évitez de désérialiser des fichiers pickle 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.

    2. Vérification des fichiers avant désérialisation
      Si vous devez charger un fichier pickle 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é.

    3. 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.

    4. Utiliser des alternatives plus sûres
      Si possible, évitez d'utiliser pickle 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.
    5. Limiter l'accès aux ressources système
      Si vous devez absolument utiliser pickle, 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 utiliser hashlib 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.