Audit de Sécurité des Dépendances
Workflow en 5 étapes
1. Scanner — détecter les vulnérabilités
Lancer l'outil natif de l'écosystème, toujours avec les transitives :
# .NET
dotnet list package --vulnerable --include-transitive
# npm / pnpm / yarn
npm audit --json
pnpm audit --json
yarn npm audit --json
# Python
pip-audit -r requirements.txt --output json
# Go
govulncheck ./...
# Rust
cargo audit
# Multi-écosystème (recommandé en CI)
trivy fs . --scanners vuln --exit-code 1
2. Évaluer — prioriser par impact réel
Ne pas traiter toutes les CVE de la même façon. Critères de décision :
| Critère |
Poids |
Question à se poser |
| CVSS score |
élevé |
≥ 7.0 = traiter en priorité |
| Exploitabilité |
très élevé |
Existe-t-il un exploit public (Exploit DB, PoC GitHub) ? |
| Accessibilité du code vulnérable |
critique |
Mon code appelle-t-il la fonction vulnérable ? |
| Exposition réseau |
élevé |
Le service est-il exposé sur Internet ? |
| Sévérité pour le domaine |
modéré |
Injection SQL ≠ DoS selon le contexte métier |
Règle pratique : une CVE High sur une lib utilisée uniquement en CLI de dev vaut moins qu'une CVE Medium sur un endpoint public.
3. Corriger — stratégies par cas
# Cas 1 : mise à jour mineure/patch disponible (idéal)
npm update <package>
dotnet add package <Package> --version <X.Y.Z>
# Cas 2 : la version fixée n'est pas compatible (conflict)
# → overrides npm (forcer une version transitive)
# package.json :
# "overrides": { "vulnerable-dep": ">=4.2.1" }
# Cas 3 : pas de fix disponible → remplacer ou isoler
# - Chercher un fork actif ou un package alternatif
# - Wrapper la lib pour limiter la surface d'attaque
# - Ajouter un contrôle applicatif (validation d'entrée) en attendant
# Cas 4 : faux positif documenté → ignorer avec justification
npm audit --json | jq '.vulnerabilities | to_entries[] | select(.value.severity=="high")'
# Puis documenter dans .auditignore / .snyk / audit-ignore.json
4. Générer un SBOM — inventaire des dépendances
# CycloneDX (standard recommandé 2025-2026)
# .NET
dotnet CycloneDX . -o ./sbom -j # JSON
# npm
npx @cyclonedx/cyclonedx-npm --output-format JSON --output-file sbom.json
# Python
cyclonedx-py environment -o sbom.json
# Universel avec Syft
syft . -o cyclonedx-json=sbom.json
Stocker le SBOM en artifact CI et le comparer entre versions pour détecter les régressions.
5. Automatiser — CI/CD et alertes
GitHub Actions (polyglotte)
name: Dependency Audit
on:
pull_request:
push:
branches: [main, develop]
schedule:
- cron: '0 7 * * 1' # lundi 7h
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# .NET
- name: .NET audit
run: |
dotnet restore
dotnet list package --vulnerable --include-transitive 2>&1 | tee audit.txt
grep -q "has the following vulnerable packages" audit.txt && exit 1 || true
# npm
- name: npm audit
working-directory: ./frontend
run: npm ci && npm audit --audit-level=high
# Scan universel (fallback)
- name: Trivy scan
uses: aquasecurity/trivy-action@master
with:
scan-type: fs
scan-ref: .
exit-code: '1'
severity: 'HIGH,CRITICAL'
format: sarif
output: trivy.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: trivy.sarif
Dependabot
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
labels: ["dependencies", "security"]
groups:
minor-patch:
update-types: ["minor", "patch"]
- package-ecosystem: "npm"
directory: "/frontend"
schedule:
interval: "weekly"
versioning-strategy: increase-if-necessary
SLA de correction
| Sévérité |
CVSS |
Délai |
Action |
| Critique |
9.0–10.0 |
24 h |
Hotfix immédiat, bloquer le merge |
| Haute |
7.0–8.9 |
7 jours |
Sprint courant, bloquer le merge |
| Moyenne |
4.0–6.9 |
30 jours |
Planifier, ne bloque pas (sauf exposition réseau) |
| Basse |
0.1–3.9 |
90 jours |
Maintenance ordinaire |
Garde-fous et anti-patterns
Ne pas faire :
npm audit fix --force sans lire ce qui change — peut introduire des breaking changes majeurs en cascade.
- Ignorer une CVE sans documenter la raison et une date de réévaluation.
- N'auditer que les dépendances directes — les transitives représentent ~80 % des vulnérabilités remontées.
- Supprimer le step d'audit de la CI "pour débloquer le build" — c'est exactement là que des incidents se produisent.
- Faire confiance à un seul scanner — coupler l'outil natif + un scanner généraliste (Trivy, Snyk).
Pièges courants :
dotnet list package --vulnerable nécessite une connexion à NuGet.org ; en environnement air-gapped, utiliser OWASP Dependency-Check avec un NVD local.
npm audit rapporte des vulnérabilités dans des devDependencies non embarquées en production : filtrer avec --omit=dev pour les audits de surface de déploiement.
- Les forks privés et les packages internes n'apparaissent pas dans les bases CVE publiques — prévoir un scan de composition du code source (SAST) en complément.
- Un SBOM obsolète de 2 semaines peut masquer une nouvelle CVE publiée — programmer la génération à chaque release.
Bonnes pratiques 2026
- Lock files obligatoires :
package-lock.json, poetry.lock, Cargo.lock, packages.lock.json (.NET) — committer et vérifier leur intégrité en CI (npm ci vs npm install).
- Vérification d'intégrité supply-chain : activer Sigstore/cosign pour les images Docker, vérifier les checksums des packages critiques.
- Score OpenSSF : intégrer la vérification du Scorecard des dépendances critiques (
ossf/scorecard-action).
- Politique de rétention : définir une version minimale supportée par lib et automatiser les alertes de fin de vie (endoflife.date API).
- Audit interne périodique : revue trimestrielle manuelle des dépendances à fort risque (auth, crypto, parsing XML/YAML).
Communication Rules — MANDATORY
- Ultra-concise. No filler, no preamble, no pleasantries.
- Never say "happy to help", "sure!", "great question", "let me", or similar.
- Tool first, talk second. Act before explaining.
- Result first. Lead with outcome, not process.
- Stop when done. No summary, no recap, no trailing commentary.
- No politeness wrappers. Direct and blunt.
- Minimum words. If one word works, do not use ten.
- No unsolicited explanations.
- No emoji unless asked.
1---2name: security-dependency-audit3description: Audit de sécurité des dépendances — détection de vulnérabilités connues, mises à jour critiques et gestion du cycle de vie des packages. À utiliser quand l'utilisateur veut vérifier la sécurité de ses dépendances, mettre à jour des packages vulnérables ou mettre en place un processus d'audit continu. Se déclenche aussi avec "audit dépendances", "vulnérabilité npm", "CVE", "dépendance vulnérable", "npm audit", "dotnet audit", "supply chain security", "dependabot". Also triggers on "dependency vulnerabilities", "npm audit findings", "outdated packages with CVEs".4---56# Audit de Sécurité des Dépendances78## Workflow en 5 étapes910### 1. Scanner — détecter les vulnérabilités1112Lancer l'outil natif de l'écosystème, **toujours avec les transitives** :1314```bash15# .NET16dotnet list package --vulnerable --include-transitive1718# npm / pnpm / yarn19npm audit --json20pnpm audit --json21yarn npm audit --json2223# Python24pip-audit -r requirements.txt --output json2526# Go27govulncheck ./...2829# Rust30cargo audit3132# Multi-écosystème (recommandé en CI)33trivy fs . --scanners vuln --exit-code 134```3536### 2. Évaluer — prioriser par impact réel3738Ne pas traiter toutes les CVE de la même façon. Critères de décision :3940| Critère | Poids | Question à se poser |41|---|---|---|42| CVSS score | élevé | ≥ 7.0 = traiter en priorité |43| Exploitabilité | très élevé | Existe-t-il un exploit public (Exploit DB, PoC GitHub) ? |44| Accessibilité du code vulnérable | critique | Mon code appelle-t-il la fonction vulnérable ? |45| Exposition réseau | élevé | Le service est-il exposé sur Internet ? |46| Sévérité pour le domaine | modéré | Injection SQL ≠ DoS selon le contexte métier |4748**Règle pratique** : une CVE High sur une lib utilisée uniquement en CLI de dev vaut moins qu'une CVE Medium sur un endpoint public.4950### 3. Corriger — stratégies par cas5152```bash53# Cas 1 : mise à jour mineure/patch disponible (idéal)54npm update <package>55dotnet add package <Package> --version <X.Y.Z>5657# Cas 2 : la version fixée n'est pas compatible (conflict)58# → overrides npm (forcer une version transitive)59# package.json :60# "overrides": { "vulnerable-dep": ">=4.2.1" }6162# Cas 3 : pas de fix disponible → remplacer ou isoler63# - Chercher un fork actif ou un package alternatif64# - Wrapper la lib pour limiter la surface d'attaque65# - Ajouter un contrôle applicatif (validation d'entrée) en attendant6667# Cas 4 : faux positif documenté → ignorer avec justification68npm audit --json | jq '.vulnerabilities | to_entries[] | select(.value.severity=="high")'69# Puis documenter dans .auditignore / .snyk / audit-ignore.json70```7172### 4. Générer un SBOM — inventaire des dépendances7374```bash75# CycloneDX (standard recommandé 2025-2026)76# .NET77dotnet CycloneDX . -o ./sbom -j # JSON7879# npm80npx @cyclonedx/cyclonedx-npm --output-format JSON --output-file sbom.json8182# Python83cyclonedx-py environment -o sbom.json8485# Universel avec Syft86syft . -o cyclonedx-json=sbom.json87```8889Stocker le SBOM en artifact CI et le comparer entre versions pour détecter les régressions.9091### 5. Automatiser — CI/CD et alertes9293#### GitHub Actions (polyglotte)9495```yaml96name: Dependency Audit97on:98 pull_request:99 push:100 branches: [main, develop]101 schedule:102 - cron: '0 7 * * 1' # lundi 7h103104jobs:105 audit:106 runs-on: ubuntu-latest107 steps:108 - uses: actions/checkout@v4109110 # .NET111 - name: .NET audit112 run: |113 dotnet restore114 dotnet list package --vulnerable --include-transitive 2>&1 | tee audit.txt115 grep -q "has the following vulnerable packages" audit.txt && exit 1 || true116117 # npm118 - name: npm audit119 working-directory: ./frontend120 run: npm ci && npm audit --audit-level=high121122 # Scan universel (fallback)123 - name: Trivy scan124 uses: aquasecurity/trivy-action@master125 with:126 scan-type: fs127 scan-ref: .128 exit-code: '1'129 severity: 'HIGH,CRITICAL'130 format: sarif131 output: trivy.sarif132133 - name: Upload SARIF134 uses: github/codeql-action/upload-sarif@v3135 if: always()136 with:137 sarif_file: trivy.sarif138```139140#### Dependabot141142```yaml143# .github/dependabot.yml144version: 2145updates:146 - package-ecosystem: "nuget"147 directory: "/"148 schedule:149 interval: "weekly"150 open-pull-requests-limit: 10151 labels: ["dependencies", "security"]152 groups:153 minor-patch:154 update-types: ["minor", "patch"]155156 - package-ecosystem: "npm"157 directory: "/frontend"158 schedule:159 interval: "weekly"160 versioning-strategy: increase-if-necessary161```162163## SLA de correction164165| Sévérité | CVSS | Délai | Action |166|---|---|---|---|167| **Critique** | 9.0–10.0 | 24 h | Hotfix immédiat, bloquer le merge |168| **Haute** | 7.0–8.9 | 7 jours | Sprint courant, bloquer le merge |169| **Moyenne** | 4.0–6.9 | 30 jours | Planifier, ne bloque pas (sauf exposition réseau) |170| **Basse** | 0.1–3.9 | 90 jours | Maintenance ordinaire |171172## Garde-fous et anti-patterns173174**Ne pas faire :**175- `npm audit fix --force` sans lire ce qui change — peut introduire des breaking changes majeurs en cascade.176- Ignorer une CVE sans documenter la raison et une date de réévaluation.177- N'auditer que les dépendances directes — les transitives représentent ~80 % des vulnérabilités remontées.178- Supprimer le step d'audit de la CI "pour débloquer le build" — c'est exactement là que des incidents se produisent.179- Faire confiance à un seul scanner — coupler l'outil natif + un scanner généraliste (Trivy, Snyk).180181**Pièges courants :**182- `dotnet list package --vulnerable` nécessite une connexion à NuGet.org ; en environnement air-gapped, utiliser OWASP Dependency-Check avec un NVD local.183- `npm audit` rapporte des vulnérabilités dans des `devDependencies` non embarquées en production : filtrer avec `--omit=dev` pour les audits de surface de déploiement.184- Les forks privés et les packages internes n'apparaissent pas dans les bases CVE publiques — prévoir un scan de composition du code source (SAST) en complément.185- Un SBOM obsolète de 2 semaines peut masquer une nouvelle CVE publiée — programmer la génération à chaque release.186187## Bonnes pratiques 2026188189- **Lock files obligatoires** : `package-lock.json`, `poetry.lock`, `Cargo.lock`, `packages.lock.json` (.NET) — committer et vérifier leur intégrité en CI (`npm ci` vs `npm install`).190- **Vérification d'intégrité supply-chain** : activer Sigstore/cosign pour les images Docker, vérifier les checksums des packages critiques.191- **Score OpenSSF** : intégrer la vérification du Scorecard des dépendances critiques (`ossf/scorecard-action`).192- **Politique de rétention** : définir une version minimale supportée par lib et automatiser les alertes de fin de vie (endoflife.date API).193- **Audit interne périodique** : revue trimestrielle manuelle des dépendances à fort risque (auth, crypto, parsing XML/YAML).194195196## Communication Rules — MANDATORY197198- Ultra-concise. No filler, no preamble, no pleasantries.199- Never say "happy to help", "sure!", "great question", "let me", or similar.200- Tool first, talk second. Act before explaining.201- Result first. Lead with outcome, not process.202- Stop when done. No summary, no recap, no trailing commentary.203- No politeness wrappers. Direct and blunt.204- Minimum words. If one word works, do not use ten.205- No unsolicited explanations.206- No emoji unless asked.