Démonstration : audit de sécurité des dépendances (npm audit)
Cette démonstration illustre une faille de type OWASP A03:2025 - Software Supply Chain Failures.
Contexte
Vous venez de récupérer le code source d'un projet existant (simulé par les fichiers fournis).
Ce projet utilise une librairie tierce (lodash) dans une version spécifique définie dans le fichier package.json.
Votre objectif est d'analyser la chaîne logistique logicielle (Software Supply Chain) de ce projet pour vérifier si les dépendances utilisées sont sécurisées, sans avoir à lire leur code source.
graph TD
subgraph "Votre Projet"
A[Code Source] --> B(package.json)
end
subgraph "Chaîne Logistique Externe"
B -- "dépend de" --> C{"lodash: 4.17.11"}
C -- "téléchargé depuis" --> D[(Registre NPM)]
D -- "code fourni par" --> E[Auteurs de Lodash]
E -- "code contient" --> F(("Faille Prototype Pollution"))
end
A -.-> F
Prérequis
- Node.js installé
- Un terminal ouvert dans le dossier contenant le fichier
package.jsonfourni.
Déroulé de la démonstration
Étape 1 : installation des dépendances
Comme pour tout projet Node.js fraîchement récupéré, commencez par installer les paquets listés dans le manifeste.
npm install
Observation : à la fin de l'installation, observez attentivement la sortie du terminal. Vous devriez voir un message du type : found X vulnerabilities (X high, X critical)
C'est le premier signal d'alarme : la "Supply Chain" contient des composants risqués.
Étape 2 : l'audit de sécurité (SCA) des dépendances
Le message précédent est un avertissement sommaire. Pour obtenir le détail des vulnérabilités (CVE), exécutez l'outil d'analyse de composition logicielle (SCA) natif :
npm audit
graph TD
A["Commande npm audit"] --> B{Analyse du package-lock.json}
B -- "compare les versions installées" --> C[(Base de données des vulnérabilités NPM/GitHub)]
C -- "trouve 'lodash 4.17.11'" --> D[Rapport de Faille]
D -- "détails" --> E["Gravité: High<br>Package: lodash<br>Faille: Prototype Pollution<br>Patch: >=4.17.21"]
E --> F[Affichage dans le terminal]
Après analyse, repérez les informations clés :
- Severity (Gravité) : High ou Critical.
- Package : lodash (la librairie coupable).
- Vulnerability : "Prototype Pollution" (le type de faille).
- Patched in : La version minimale requise pour être en sécurité (ex: >=4.17.21).
Étape 3 : tentative de remédiation
Essayons d'utiliser l'outil de correction automatique de npm.
npm audit fix
Observation : relancez un npm audit après cette commande. Vous remarquerez que la faille est toujours présente !
Pourquoi ?
npm audit fixrespecte les règles de versionnage sémantique (SemVer) définies dans votrepackage.json.- Notre
package.jsoncontient"lodash": "4.17.11". C'est une version stricte (pinning). npm audit fixne peut pas mettre à jour vers la4.17.21(requise par le patch) car cela viole la règle "exactement 4.17.11" que nous avons définie.
Note : Si le
package.jsonavait utilisé"lodash": "^4.17.11"(un "caret"),npm audit fixaurait fonctionné du premier coup, car le^autorise les mises à jour mineures et de patch (comme la4.17.21).
Étape 4 : remédiation forcée
Pour corriger la faille malgré notre contrainte de version stricte, nous devons forcer npm à ignorer la règle du package.json et à mettre à jour le package-lock.json
.
npm audit fix --force
graph TD
A{Scénario de remédiation}
A -- "npm audit fix" --> B(Analyse package.json)
B -- "version '4.17.11' est stricte" --> C["Échec: ne peut pas mettre à jour en respectant la contrainte"]
A -- "npm audit fix --force" --> D(Analyse package.json)
D -- "option '--force' ignore la contrainte" --> E["Succès: mise à jour forcée vers '4.17.21'"]
E --> F(Fichier package-lock.json mis à jour)
Actions effectuées par npm audit fix --force :
- Téléchargement de la version corrigée (ex: 4.17.21).
- Mise à jour forcée du fichier
package-lock.jsonpour utiliser cette nouvelle version. - Suppression de la version vulnérable (
4.17.11) desnode_modules.
Étape 5 : vérification finale (sanity check)
Assurez-vous que la faille a bien été colmatée en relançant l'audit.
npm audit
Résultat attendu : found 0 vulnerabilities
Conclusion
- A03:2025 Supply Chain Failures : la sécurité de votre application ne dépend pas seulement de votre code, mais aussi de celui des autres (vos dépendances).
- SCA (Software Composition Analysis) : l'utilisation d'outils comme
npm audit(ou Snyk, OWASP Dependency Check) est indispensable pour détecter les composants obsolètes ou vulnérables. - Automatisation : dans un environnement professionnel (DevSecOps), cette commande d'audit devrait être intégrée dans la CI/CD et bloquer automatiquement le déploiement si une faille critique est détectée.