Avant de déployer une application en production, je passe toujours par une étape que beaucoup négligent : vérifier que les paquets npm que j’utilise ne contiennent pas de backdoor ou de code malveillant. Les attaques sur la chaîne d'approvisionnement logicielle se multiplient, et un seul paquet compromis peut ouvrir la porte à des incidents coûteux. Dans cet article, je partage ma méthode pratique, les outils que j’utilise et les signaux d’alerte auxquels je fais attention pour détecter une dépendance malveillante avant la mise en production.
Pourquoi il faut se méfier des dépendances npm
J’ai vu trop de projets où des centaines de paquets sont ajoutés sans audit approfondi. npm facilite la réutilisation, mais cette facilité a un coût : une dépendance transitive peut introduire une backdoor, un mineur de cryptomonnaie, ou exfiltrer des données. De plus, il existe des cas documentés où des auteurs légitimes ont vu leurs paquets détournés (compte compromis, takeover suite à inactivité), ou où des paquets ont été volontairement publiés avec du code malveillant.
Signes d’alerte à repérer rapidement
Nom ou version suspecte : un changement radical du nom du paquet, des versions qui sautent du jour au lendemain ou des releases contenant des versions “0.0.x” atypiques.Scripts postinstall inhabituels : les scripts définis dans package.json (postinstall, prepare, preinstall) peuvent exécuter du code arbitraire au moment de l'installation.Fichiers binaires ou exécutable non justifiés : présence de fichiers compilés ou d’exécutables dont la provenance n’est pas claire.Taille du paquet étonnamment grande : un package qui devient soudainement volumineux peut contenir des ressources malveillantes.Changements récents et auteurs inconnus : mainteneurs inconnus prenant le contrôle, ou commits récents qui ajoutent du code réseau/crypto sans justification.Étapes pratiques pour auditer un paquet npm
Voici ma checklist que j’applique systématiquement :
Utiliser un environnement isolé : je clone le dépôt et j’ouvre le package dans un container ou une VM. Jamais directement sur ma machine de travail.Examiner package.json : je vérifie les scripts (postinstall, preinstall, prepare), les dépendances peer, et les champs “maintainers” ou “repository”.Auditer le contenu du paquet : décompressez le tarball du package (npm pack nom) et inspectez les fichiers inclus — attention aux fichiers .tgz qui contiennent souvent plus que prévu.Rechercher les chaînes suspectes : je fais des recherches de mots-clés comme “exec”, “eval”, “child_process”, “fetch”, “net.createConnection”, “atob”, “fromCharCode”, “base64” ou encore "crypto" dans le code.Vérifier les dépendances transitive : npm ls --all permet d’avoir l’arbre des dépendances, mais j’utilise aussi des outils automatiques (voir plus bas).Comparer versions et changelog : un changement important dans le changelog sans explication technique est suspect.Outils que j’utilise (et pourquoi)
Les outils automatisés ne remplacent pas l’analyse manuelle, mais ils accélèrent grandement le travail :
| Outil | Usage | Ce que je regarde |
|---|
| npm audit | Détecte vulnérabilités connues | ALERTES de vulnérabilités, dépendances à mettre à jour |
| Snyk | Analyse des vulnérabilités + règles SCA | Signalement des paquets malveillants connus, patchs et fix PR |
| OSS Index / Sonatype Nexus | Base de données de vulnérabilités | Contexte des vulnérabilités |
| Gauges comme npm ci et npm audit | Installation propre en CI | Installer via lockfile pour reproduire exactement |
| retire.js / depcheck | Détecte paquets obsolètes / non utilisés | Nettoyage et réduction de la surface d'attaque |
| CodeQL / Semgrep | Analyse statique | Règles personnalisées pour chercher patterns de backdoors |
Comment j’analyse un package suspect en pratique
Cas concret : j’ai découvert un paquet transitoire qui ajoutait un script postinstall. Voici la méthode que j’ai appliquée :
J’ai téléchargé le tarball avec npm pack et décompressé dans un dossier isolé.J’ai ouvert package.json et noté les scripts. Le postinstall faisait appel à un script JS minifié.J’ai beautifié le script minifié (outil de prettify) pour le rendre lisible, puis recherché des appels réseau et des fonctions d’exécution externe (child_process.exec).J’ai mis le script dans un sandbox Node (avec variables d’environnement vidées) et exécuté en mode lecture seule pour observer les accès systèmes.Enfin, j’ai cherché l’historique Git du paquet sur GitHub : le commit qui introduisait le script venait d’un compte inconnu et le message était vague.Bonnes pratiques à intégrer en CI/CD
Pour éviter la surprise en production, j’ai automatisé plusieurs vérifications dans mes pipelines :
Installer strictement via lockfile (npm ci) : ceci garantit de reproduire l’arbre exact des dépendances validé en dev.Bloquer les scripts d’installation non signés : dans certains projets, j’ai mis en place une politique qui refuse les paquets contenant des scripts postinstall sans revue.Scanner avec plusieurs outils : npm audit + Snyk + Semgrep pour couvrir plusieurs types de détections.Signer et vérifier les packages : encourager l’usage de signatures et vérifier l’intégrité (shasums).Autoriser via une liste blanche : pour les paquets critiques, j’utilise une liste de paquets approuvés après revue manuelle.Questions fréquentes que je me pose (et mes réponses)
Faut-il auditer chaque dépendance ? Idéalement oui pour les dépendances critiques. En pratique, je priorise :1) packages qui ont accès aux données sensibles,2) paquets natifs (avec bindings C/C++),3) paquets avec postinstall ou scripts.Les outils automatiques suffisent-ils ? Non. Ils détectent beaucoup de vulnérabilités connues, mais les backdoors nouvelles ou obfusquées nécessitent une inspection humaine et des règles d’analyse statique ciblées.Que faire si je découvre un paquet malveillant ? Isoler l’impact (revert/retirer la dépendance), alerter l’équipe, signaler sur le registre (npm), et informer la communauté (GitHub Issue, Snyk, OSS advisories).Ressources et pistes pour aller plus loin
Pour approfondir, j’utilise régulièrement :
Les pages de sécurité npm (security advisories).Les blogs de Snyk et de GitHub sur les attaques de la chaîne logistique.Outils open-source comme Semgrep avec règles personnalisées pour détecter patterns suspects.Si vous gérez un projet sur https://www.logiciel-actu.fr ou ailleurs, intégrer ces vérifications dans votre workflow réduit fortement le risque d’être victime d’une backdoor déposée via une dépendance npm. Dans mes prochains articles je détaillerai des règles Semgrep pratiques et des exemples de scripts postinstall malveillants pour que vous puissiez reconnaître les signaux rapidement.