Lorsque je prépare un déploiement Python, une de mes préoccupations majeures est toujours la chaîne d’approvisionnement des dépendances. Une dépendance compromise — qu’il s’agisse d’une typosquatting, d’une mise à jour malveillante ou d’une backdoor volontaire — peut compromettre toute l’infrastructure. Dans cet article, je vous partage ma méthode concrète pour détecter une backdoor dans une dépendance pip avant de la pousser en production : outils, commandes et bonnes pratiques que j’utilise au quotidien.
Préparer un environnement sûr pour l’analyse
Avant de toucher au code suspect, j’isole l’analyse. J’utilise toujours un virtualenv ou un conteneur Docker pour éviter toute exécution accidentelle sur ma machine principale.
Commandes utiles :
1) Récupérer la distribution et ses métadonnées
La première étape consiste à récupérer l’archive (wheel ou sdist) et à inspecter les métadonnées :
Vérifiez les fichiers clé : setup.py, pyproject.toml, PKG-INFO, et tous les scripts dans le package. Une backdoor peut être cachée dans des scripts d’installation ou dans un import exécutant du code à l’importation.
2) Rechercher du code exécuté à l’import (import-time execution)
Je scrute les fichiers __init__.py et tout module susceptible d’être importé automatiquement. Recherchez :
Exemples de commandes :
3) Analyse statique avec des outils dédiés
J’utilise plusieurs outils complémentaires — aucun n’est parfait, mais combinés ils couvrent beaucoup de cas.
| Outil | Usage clé | Commande |
|---|---|---|
| pip-audit | Vulnérabilités connues | pip-audit -r requirements.txt |
| bandit | Analyse statique de code Python | bandit -r extracted_pkg/ |
| safety | Vulnérabilités SCA | safety check -r requirements.txt |
| trivy | Scan d’images et packages | trivy fs extracted_pkg/ |
| yara | Règles pour patterns malveillants | yara rules.yar extracted_pkg/ |
Je lance ces outils et j’analyse les faux positifs. Bandit est très utile pour repérer les patterns risqués (eval, subprocess) ; pip-audit/safety repèrent les vulnérabilités connues. Trivy peut attraper des fichiers binaires suspects.
4) Inspecter les scripts d’installation et entry points
Les scripts fournis (console_scripts, scripts dans setup.py) sont des vecteurs classiques :
Commande :
5) Vérifier la chaîne de publication sur PyPI
Je consulte l’historique du paquet sur PyPI : date des versions, auteurs, et propriétaires du projet. Un changement soudain de mainteneurs ou une version très récente sans historique sont des signaux d’alerte.
Vous pouvez aussi utiliser l’API JSON :
6) Comparer le code avec les dépôts sources
Souvent le package PyPI contient un côté compilé ou du code différent du repo GitHub. J’extrais la version installée et je la compare au dépôt source :
Une divergence surprenante peut indiquer que la version publiée contient du code malveillant non présent dans le repo source.
7) Analyse dynamique (sandboxed)
Si la statique indique des éléments suspects mais pas concluants, je fais tourner le package dans un environnement sandbox (Docker, VM) avec monitoring réseau/fichiers :
Je m’attends à voir des connexions réseau non justifiées, lancement de shells, connexion à des domaines obscurs, ou écritures dans /etc, /var, ~/.ssh.
8) Signatures et hachages
Vérifier les signatures GPG si disponibles et comparer les hachages. Un paquet signé par une clé connue est plus rassurant.
9) Bonnes pratiques pour se protéger
Outils et commandes récapitulatives que j’utilise systématiquement
En appliquant cette démarche, j’ai déjà repéré plusieurs packages contenant des appels réseau suspects ou des imports exécutant du code à l’importation. Aucun outil ne remplace la prudence humaine : croiser les résultats, vérifier l’historique du mainteneur et exécuter des tests en sandbox sont indispensables. Si vous voulez, je peux partager un checklist prête à intégrer en pipeline CI pour automatiser une grande partie de ces vérifications.