# 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.
```mermaid
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.json` fourni.
---
## 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.
```bash
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 :
```bash
npm audit
```
```mermaid
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
Package: lodash
Faille: Prototype Pollution
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.
```bash
npm audit fix
```
**Observation :** relancez un `npm audit` après cette commande. Vous remarquerez que **la faille est toujours présente \!**
**Pourquoi ?**
* `npm audit fix` respecte les règles de versionnage sémantique (SemVer) définies dans votre `package.json`.
* Notre `package.json` contient `"lodash": "4.17.11"`. C'est une version **stricte** (pinning).
* `npm audit fix` ne peut pas mettre à jour vers la `4.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.json` avait utilisé `"lodash": "^4.17.11"` (un "caret"), `npm audit fix` aurait fonctionné du premier coup, car le `^` autorise les mises à jour mineures et de patch (comme la `4.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`
.
```bash
npm audit fix --force
```
```mermaid
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` :
1. Téléchargement de la version corrigée (ex: 4.17.21).
2. Mise à jour forcée du fichier `package-lock.json` pour utiliser cette nouvelle version.
3. Suppression de la version vulnérable (`4.17.11`) des `node_modules`.
### Étape 5 : vérification finale (sanity check)
Assurez-vous que la faille a bien été colmatée en relançant l'audit.
```bash
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.