Scan de dépendances¶
Détecter les CVE dans vos dépendances avant qu'elles ne deviennent un incident de sécurité.
C'est quoi une CVE ?¶
Une CVE (Common Vulnerabilities and Exposures) est un identifiant unique attribue a une faille de sécurité connue, au format CVE-YYYY-NNNNN.
Deux bases de données principales recensent ces failles :
- NVD (National Vulnerability Database) — maintenue par le NIST (USA)
- OSV (Open Source Vulnerabilities) — maintenue par Google, orientée open source
Score CVSS¶
Chaque CVE reçoit un score CVSS (Common Vulnerability Scoring System) qui mesure sa gravite :
| Score CVSS | Sévérité | Exemple |
|---|---|---|
| 9.0 - 10.0 | Critical | Exécution de code à distance sans authentification |
| 7.0 - 8.9 | High | Elevation de privileges |
| 4.0 - 6.9 | Medium | Fuite d'information limitee |
| 0.1 - 3.9 | Low | Denial of service local |
Cycle de vie d'une vulnérabilité¶
graph LR
A["Découverte"] --> B["Attribution CVE"] --> C["Publication"] --> D["Patch"] --> E["Adoption"] - Découverte — un chercheur ou un attaquant identifie la faille
- Attribution CVE — le MITRE attribue un identifiant unique
- Publication — la faille est rendue publique avec ses détails
- Patch — le mainteneur publie un correctif
- Adoption — les utilisateurs mettent à jour leurs dépendances
La fenêtre d'exposition
Entre la publication et l'adoption, votre application est vulnerable. Le scan automatise réduit cette fenêtre au minimum.
Pourquoi scanner¶
Vos dépendances, c'est du code que vous n'avez pas écrit mais dont vous etes responsable. Un projet Python ou JavaScript typique embarque des centaines de paquets transitifs — autant de surfaces d'attaque potentielles.
Exemples marquants¶
- Log4Shell (
CVE-2021-44228, CVSS 10.0) — une simple chaîne de caractères dans un log permettait l'exécution de code à distance. Des milliers d'applications Java impactees en quelques heures. - event-stream (npm, 2018) — un mainteneur malveillant a injecte du code visant les portefeuilles de cryptomonnaies via une dépendance transitive. Supply chain attack classique.
Vos dépendances sont votre responsabilité
Même si vous n'avez pas écrit le code vulnerable, c'est votre application qui sera compromise. Scanner régulièrement est une obligation, pas une option.
Python — pip-audit¶
Installation¶
Utilisation de base¶
pip-audit interroge la base OSV (Google) et compare les versions installees dans votre environnement avec les vulnérabilités connues.
Mode offline (airgap)¶
Pour les environnements deconnectes d'Internet :
-
Sur une machine connectee, télécharger le cache :
-
Transferer le dossier
pip-audit-cachevers la machine cible -
Scanner en mode offline :
Lecture du rapport¶
Le rapport affiche quatre colonnes essentielles :
| Colonne | Description |
|---|---|
| Name | Nom du paquet vulnerable |
| Version | Version installee |
| ID | Identifiant CVE ou PYSEC |
| Fix | Version corrigee disponible |
Remédiation¶
Remplacez package par le nom du paquet et fixed_version par la version corrigee indiquee dans le rapport.
Exemple de rapport
Found 3 known vulnerabilities in 2 packages
Name Version ID Fix Versions
---------- -------- ------------------- ------------
requests 2.25.1 PYSEC-2023-74 2.31.0
urllib3 1.26.5 PYSEC-2023-212 1.26.18
urllib3 1.26.5 CVE-2023-45803 1.26.18
Pour corriger :
JavaScript — npm audit¶
Utilisation de base¶
npm audit est intégré directement dans npm — aucune installation supplémentaire nécessaire.
Lecture du rapport¶
Le rapport affiche pour chaque vulnérabilité :
- Severity — low, moderate, high, critical
- Package — le paquet concerne
- Patched in — la version corrigee
- Dependency of — quel paquet de premier niveau tire cette dépendance
- Path — la chaîne de dépendances complète
Correction automatique¶
# Correction conservative (ne casse pas les versions majeures)
npm audit fix
# Correction forcee (peut mettre a jour des versions majeures)
npm audit fix --force
Attention a --force
npm audit fix --force peut introduire des breaking changes en mettant à jour des dépendances vers une version majeure supérieure. Toujours vérifier que l'application fonctionne après un fix force.
Airgap : npm audit nécessité un registre
npm audit interroge le registre npm pour obtenir les données de vulnérabilité. En environnement déconnecté, utilisez un registre prive comme Verdaccio qui peut être synchronisé manuellement, ou preferez Trivy en mode offline.
Trivy filesystem — alternative unifiee¶
Trivy (Aqua Security) est un scanner unique capable d'analyser les dépendances de multiples langages : Python, JavaScript, Go, Java, Ruby, Rust, etc.
Préparation offline¶
Sur une machine connectee, télécharger la base de vulnérabilités :
Transferer le dossier de cache (par défaut ~/.cache/trivy/) vers la machine cible.
Scan¶
--skip-db-download— utilise la base locale, pas de connexion requise--severity HIGH,CRITICAL— filtre les résultats pour se concentrer sur les failles graves.— scanne le répertoire courant
Comparaison avec les outils natifs¶
Trivy détecté souvent les mêmes CVE que pip-audit ou npm audit, mais offre l'avantage d'un outil unique pour tous les langages d'un projet polyglotte. Comparez les résultats pour vous assurer qu'aucune faille n'echappe a un seul outil.
Tableau comparatif¶
| pip-audit | npm audit | Trivy filesystem | |
|---|---|---|---|
| Langages | Python | JavaScript | Multi-langage |
| Airgap | Oui (cache) | Partiel (Verdaccio) | Oui (DB offline) |
| Format sortie | Table, JSON | Table, JSON | Table, JSON, SARIF |
| Intégration CI | Script | Script | Script + plugins |
Points clés¶
À retenir
- Scannez vos dépendances à chaque build, pas seulement à la release
- Combinez un outil natif (
pip-audit,npm audit) avec Trivy pour une couverture maximale - En environnement airgap, preparez les bases de données sur une machine connectee
- Traitez les vulnérabilités Critical et High en priorité