Les attaques supply chain sur l'ecosysteme npm ne sont plus des evenements rares — elles sont devenues la norme. En 2025-2026, les incidents se sont multiplies a un rythme alarmant : 317 packages npm malveillants decouverts en mai 2026, le compromis de la supply chain TanStack avec 169 paquets et 518 millions de telechargements affectes, sans oublier les attaques par typosquatting qui ciblent quotidiennement les noms de paquets populaires. Chaque npm install que vous executez est un acte de confiance — confiance dans chaque mainteneur, chaque dependance transitive, chaque script post-install de votre arbre de dependances.
Ce guide vous donne une methode systematique en 7 etapes pour auditer vos dependances npm et securiser votre supply chain. Chaque etape est actionnable, reproductible, et utilise des outils open source. Que vous travailliez sur un side project ou sur une application en production utilisee par des milliers d'utilisateurs, cette methode s'adapte a votre contexte. L'objectif n'est pas la securite parfaite — elle n'existe pas — mais de reduire drastiquement votre surface d'attaque avec un investissement en temps raisonnable.
Etape 1 — Executer npm audit et comprendre les resultats
La premiere etape est la plus simple et la plus souvent negligee. Ouvrez un terminal a la racine de votre projet et executez npm audit. Cette commande analyse votre arbre de dependances complet (directes et transitives) et le compare a la base de donnees GitHub Advisory Database pour identifier les vulnerabilites connues. Le rapport classe les vulnerabilites par niveau de severite : critical, high, moderate, et low.
Pour obtenir un rapport detaille au format JSON exploitable par d'autres outils, utilisez npm audit --json > audit-report.json. Pour les projets qui ne peuvent pas tolerer de vulnerabilites critiques ou elevees, ajoutez le flag --audit-level=high qui fera echouer la commande (exit code non-zero) si des vulnerabilites high ou critical sont detectees — ideal pour l'integration dans un pipeline CI/CD.
Un point crucial que beaucoup de developpeurs ignorent : npm audit fix ne resout pas tous les problemes. Cette commande ne met a jour que les dependances qui peuvent etre bumped sans changement de version majeure (semver-compatible). Pour les vulnerabilites qui necessitent un breaking change, vous verrez le message "requires manual review". Dans ce cas, trois options : mettre a jour manuellement avec npm audit fix --force (attention aux breaking changes), utiliser overrides dans votre package.json pour forcer une version specifique d'une dependance transitive, ou remplacer la dependance vulnerable par une alternative.
Concretement, voici la sequence de commandes a executer pour un premier audit complet :
# Audit de base — voir toutes les vulnerabilites npm audit # Rapport JSON detaille pour traitement automatise npm audit --json > audit-report.json # Corrections automatiques semver-compatibles npm audit fix # Voir ce qui reste apres fix npm audit # Pour les cas desesperes (attention breaking changes) npm audit fix --force # Audit uniquement la production (ignore devDependencies) npm audit --omit=dev
Attention : npm audit ne detecte que les vulnerabilites connues et referencees. Il ne couvre pas le typosquatting, les scripts post-install malveillants, les paquets avec des backdoors non encore decouverts, ni les zero-days. C'est un point de depart indispensable, pas une solution complete — d'ou les 6 etapes suivantes.
Etape 2 — Scanner les licences de vos dependances
La securite supply chain ne se limite pas aux vulnerabilites techniques — les risques juridiques sont tout aussi reels. Une dependance sous licence GPL dans un projet proprietaire peut forcer la publication du code source de votre application. Une dependance sous licence SSPL peut poser des problemes si vous fournissez un service cloud. Et une dependance sans licence du tout est legalement inutilisable dans un contexte professionnel.
Utilisez license-checker pour generer un rapport complet des licences de toutes vos dependances. Installez-le globalement avec npm install -g license-checker, puis executez license-checker --summary pour un apercu rapide, ou license-checker --csv > licenses.csv pour un export exploitable. Pour bloquer les licences problematiques en CI/CD, utilisez le flag --failOn : par exemple, license-checker --failOn "GPL-3.0;AGPL-3.0;SSPL" fera echouer le build si une de ces licences est detectee.
Un piege frequent : certains paquets npm declarent une licence dans leur package.json mais incluent un fichier LICENSE different dans le tarball publie. Toujours verifier le fichier LICENSE reel, pas uniquement le champ license du manifeste. L'outil licensee de GitHub est plus fiable car il analyse le contenu reel des fichiers de licence.
Etape 3 — Verifier l'integrite du lockfile
Le fichier package-lock.json est votre premiere ligne de defense contre les modifications non autorisees de dependances. Il enregistre les versions exactes, les URLs de telechargement, et les hashes d'integrite (SHA-512) de chaque paquet installe. Quand vous executez npm ci (a utiliser en CI/CD au lieu de npm install), npm verifie que les hashes des paquets telecharges correspondent a ceux du lockfile. Toute discordance declenche une erreur.
Trois regles non negociables pour le lockfile. Premierement, commitez toujours vostrong package-lock.json dans votre repository Git. Un projet sans lockfile commite est un projet ou chaque npm install peut installer des versions differentes selon le moment et la machine — c'est une faille de reproductibilite et de securite. Deuxiemement, reviewez les diffs du lockfile dans chaque pull request. Un changement inattendu dans le lockfile — une URL qui pointe vers un registre different, un hash qui change sans raison apparente — est un signal d'alerte. Troisiemement, utilisez npm ci et jamais npm install dans vos pipelines CI/CD. La commande npm ci supprime node_modules et installe exactement ce qui est dans le lockfile — pas de resolution de versions, pas de surprise.
Pour verifier l'integrite de votre lockfile existant, utilisez lockfile-lint. Cet outil verifie que tous les paquets sont telecharges depuis le registre npm officiel (pas de registre tiers non autorise), que les hashes d'integrite sont presents pour tous les paquets, et que les URLs utilisent HTTPS. Installez-le et executez : npx lockfile-lint --path package-lock.json --type npm --allowed-hosts npm --validate-https.
Etape 4 — Analyser les scripts d'installation
Les scripts preinstall, postinstall, et install sont le vecteur d'attaque numero un des paquets npm malveillants. Ces scripts s'executent automatiquement pendant npm install avec les privileges de l'utilisateur courant — ce qui signifie qu'un script malveillant peut lire vos variables d'environnement (y compris les tokens et cles API), ecrire dans le systeme de fichiers, et envoyer des donnees a un serveur distant. Les attaques documentees ces derniers mois utilisent quasi systematiquement ce vecteur.
Pour lister tous les scripts d'installation dans votre arbre de dependances, utilisez can-i-ignore-scripts ou inspectez manuellement avec un script shell qui parcourt les package.json dans node_modules. Chaque paquet avec un postinstall qui execute du code obfusque, telechargement depuis une URL externe, ou accede aux variables d'environnement merite une investigation approfondie.
La protection la plus efficace est d'utiliser --ignore-scripts par defaut et de n'activer les scripts que pour les paquets qui en ont legitimement besoin (comme node-gyp pour les modules natifs). Configurez npm globalement avec npm config set ignore-scripts true, puis autorisez les scripts paquet par paquet dans votre .npmrc. C'est plus contraignant, mais c'est la seule approche qui transforme les scripts en opt-in plutot qu'en opt-out.
# Lister tous les scripts d'installation dans vos dependances
find node_modules -name "package.json" -maxdepth 3 \
-exec grep -l '"postinstall\|preinstall\|install"' {} \;
# Desactiver les scripts par defaut
npm config set ignore-scripts true
# Installer avec scripts desactives (securise)
npm ci --ignore-scripts
# Ensuite, executer les scripts necessaires manuellement
npm rebuild # recompile les modules natifsBesoin d'un audit de securite de vos dependances npm ?
Audit complet, mise en place de pipelines securises, formation equipe — notre equipe specialisee en securite supply chain vous accompagne.
Obtenir mon devis gratuitEtape 5 — Evaluer la sante de vos dependances
Une dependance peut etre exempte de CVE connues et avoir une licence propre, tout en representant un risque operationnel majeur si elle n'est plus maintenue. Un paquet dont le dernier commit date de 3 ans, dont le mainteneur ne repond plus aux issues, et qui a des PRs de securite ouvertes sans review est une bombe a retardement dans votre node_modules.
Pour chaque dependance directe de votre package.json, verifiez ces indicateurs de sante. La derniere publication npm : utilisez npm view <package> time --json pour voir la date de chaque version publiee. Le nombre de mainteneurs : npm view <package> maintainers — un seul mainteneur est un risque (bus factor de 1). Les telechargements hebdomadaires : un paquet avec moins de 100 telechargements par semaine merite une evaluation attentive de sa pertinence. L'activite GitHub : issues ouvertes sans reponse depuis 6 mois et plus sont un signal d'alarme.
L'outil npm-check automatise une partie de cette verification : npx npm-check affiche un rapport interactif des dependances obsoletes, inutilisees, et non maintenues. Pour une analyse plus poussee, socket.dev fournit un score de sante pour chaque paquet npm incluant l'activite du mainteneur, la qualite des tests, la presence de types TypeScript, et l'historique de securite. Si une dependance echoue sur plusieurs indicateurs, il est temps de chercher une alternative — ou de la forker et la maintenir vous-meme.
Etape 6 — Generer un SBOM (Software Bill of Materials)
Le SBOM est devenu un livrable obligatoire dans de nombreux contextes reglementaires. La directive NIS2 en Europe, le reglement CRA (Cyber Resilience Act), et l'executive order americain sur la cybersecurite exigent tous une documentation precise des composants logiciels utilises dans les produits et services. Meme si votre projet n'est pas soumis a ces reglementations aujourd'hui, generer un SBOM est une bonne pratique qui facilite l'audit et la reponse aux incidents.
npm inclut un generateur de SBOM natif depuis la version 10 : npm sbom --sbom-format cyclonedx genere un SBOM au format CycloneDX, et npm sbom --sbom-format spdx pour le format SPDX. Les deux formats sont acceptes par les regulateurs et les outils de securite. Pour un SBOM plus riche incluant les vulnerabilites connues, utilisez cdxgen de l'OWASP : npx @cyclonedx/cdxgen -o sbom.json.
Integrez la generation du SBOM dans votre pipeline CI/CD pour que chaque build de production soit accompagne de son SBOM a jour. Stockez les SBOM dans un registre accessible a votre equipe securite — quand une nouvelle CVE est publiee, pouvoir chercher instantanement "quels de nos projets utilisent le paquet X en version Y" est la difference entre une reponse en minutes et une reponse en jours. C'est exactement ce type d'infrastructure que des initiatives comme Project Lightwell d'IBM et Red Hat cherchent a industrialiser a l'echelle mondiale.
Etape 7 — Automatiser l'audit dans votre pipeline CI/CD
Les etapes 1 a 6 ne servent a rien si elles ne sont pas executees systematiquement. L'audit manuel est un processus que les humains oublient, repoussent, et negligent sous la pression des deadlines. La seule solution fiable est l'automatisation dans le pipeline CI/CD — chaque push, chaque pull request, chaque build de production doit passer par les verifications de securite.
Voici un exemple de workflow GitHub Actions qui integre les 6 etapes precedentes dans un pipeline automatise. Ce workflow s'execute a chaque push sur les branches principales et a chaque pull request. Il bloque le merge si des vulnerabilites critiques ou elevees sont detectees, si des licences interdites sont presentes, ou si l'integrite du lockfile est compromise :
# .github/workflows/npm-security-audit.yml
name: NPM Security Audit
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
security-audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
# Installation securisee via lockfile
- run: npm ci --ignore-scripts
# Etape 1: Audit des vulnerabilites
- name: NPM Audit
run: npm audit --audit-level=high
# Etape 2: Scan des licences
- name: License Check
run: npx license-checker --failOn "GPL-3.0;AGPL-3.0"
# Etape 3: Verification lockfile
- name: Lockfile Lint
run: |
npx lockfile-lint \
--path package-lock.json \
--type npm \
--allowed-hosts npm \
--validate-https
# Etape 6: Generation SBOM
- name: Generate SBOM
run: npm sbom --sbom-format cyclonedx > sbom.json
- name: Upload SBOM
uses: actions/upload-artifact@v4
with:
name: sbom
path: sbom.jsonEn complement de ce workflow, configurez Dependabot ou Renovate pour automatiser les mises a jour de dependances. Dependabot est integre nativement a GitHub et cree des pull requests automatiques quand une nouvelle version d'une dependance corrige une vulnerabilite. Renovate offre plus de flexibilite (groupage de mises a jour, regles d'auto-merge pour les patch versions, scheduling) et supporte davantage de registres. Pour la configuration de ces outils, consultez notre guide detaille sur la configuration de Dependabot et Renovate.
Enfin, pour les projets critiques, ajoutez une couche de monitoring continu. Des outils comme socket.dev ou snyk monitor surveillent vos dependances en continu et vous alertent immediatement quand une nouvelle vulnerabilite est decouverte — meme entre deux deployments. C'est la difference entre apprendre qu'une dependance est vulnerable lors de votre prochain build (potentiellement des jours apres la publication de la CVE) et etre alerte en temps reel.
Recapitulatif : la checklist des 7 etapes
Voici la checklist complete que vous pouvez copier et integrer dans la documentation de votre projet. Chaque etape est autonome mais l'ensemble constitue une defense en profondeur qui couvre les principaux vecteurs d'attaque supply chain npm :
npm audit --audit-level=highlicense-checker --failOnlockfile-lint et toujours utiliser npm ci--ignore-scripts par defautnpm sbom pour la conformite et la traçabiliteCette methode n'est pas exhaustive — elle ne couvre pas les attaques zero-day, les compromis de comptes mainteneur, ou les vulnerabilites dans le runtime Node.js lui-meme. Mais elle reduit drastiquement votre surface d'attaque et vous place dans une position ou les risques residuels sont identifies et acceptes consciemment, plutot que ignores par defaut. C'est la difference entre la securite et l'illusion de securite. Pour les developpeurs qui veulent aller plus loin, notre guide complet sur la securisation des pipelines npm contre les attaques supply chain couvre des scenarios plus avances incluant les registres prives, les scoped packages, et la verification de provenance npm.
FAQ
A quelle frequence faut-il auditer ses dependances npm ?
Idealement, l'audit doit etre automatise et s'executer a chaque push et pull request via votre pipeline CI/CD (etape 7 de ce guide). En complement, un audit manuel approfondi (etapes 3 a 6) devrait etre realise au minimum une fois par mois, et immediatement apres toute alerte de securite majeure dans l'ecosysteme npm. Les projets en production avec des donnees sensibles devraient viser un audit hebdomadaire des vulnerabilites critiques. L'utilisation de Dependabot ou Renovate automatise la detection des mises a jour de securite entre les audits manuels.
npm audit suffit-il pour securiser sa supply chain ?
Non. npm audit est un point de depart necessaire mais insuffisant. Il ne detecte que les vulnerabilites connues et referencees dans la base GitHub Advisory Database. Il ne couvre pas le typosquatting, les scripts post-install malveillants, les dependances non maintenues, ni les attaques zero-day. Un audit complet doit inclure la verification du lockfile (etape 3), l'analyse des scripts d'installation (etape 4), le scanning des licences (etape 2), l'evaluation de la sante des dependances (etape 5), et la generation d'un SBOM (etape 6). C'est pourquoi ce guide comporte 7 etapes et pas une seule.
Comment detecter un paquet npm malveillant avant de l'installer ?
Avant d'installer un paquet, verifiez plusieurs signaux d'alerte : le nombre de telechargements hebdomadaires (mefiance si inferieur a 1000 pour un paquet qui pretend etre populaire), la date de derniere publication (mefiance si plus de 2 ans sans mise a jour), le nombre de mainteneurs (mefiance si un seul mainteneur sans historique verifiable), la presence de scripts postinstall ou preinstall suspects, la coherence entre le nom du paquet et son contenu, et la reputation du mainteneur sur npm et GitHub. Des outils comme socket.dev, npm-audit-resolver, et snyk permettent d'automatiser une partie de ces verifications. Pour les paquets critiques, prenez le temps de lire le code source sur GitHub avant d'installer.
Faut-il utiliser npm audit ou des outils tiers comme Snyk ou Socket ?
Les deux approches sont complementaires. npm audit est gratuit, integre nativement dans npm, et couvre les vulnerabilites connues de la base GitHub Advisory Database — c'est votre baseline. Snyk ajoute une base de vulnerabilites proprietaire plus large, des suggestions de fix automatiques, et le monitoring continu de vos projets. Socket.dev se specialise dans la detection comportementale des paquets malveillants — scripts suspects, exfiltration de donnees, typosquatting — ce que npm audit ne couvre pas du tout. Pour une couverture maximale, utilisez npm audit en CI/CD comme baseline (gratuit), completez avec Socket pour la detection comportementale (gratuit pour les projets open source), et ajoutez Snyk ou Grype si vous avez besoin de couvrir les images container.
Audit de securite supply chain et formation equipe
Audit complet de vos dependances npm/PyPI/Maven, mise en place de pipelines CI/CD securises, formation developpeurs aux bonnes pratiques supply chain — notre equipe vous accompagne.
Demander un accompagnementArticles lies :