Sécurité de la supply chain¶
Dépendances compromises, typosquatting et paquets abandonnes — protéger votre chaîne de build de bout en bout.
Pourquoi la supply chain est une cible¶
En 2020, SolarWinds a été compromise via une mise à jour logicielle signee. En 2021, ua-parser-js (npm, 8M téléchargements/semaine) a été detourne pour miner du crypto. En 2022, colors.js a été sabote par son auteur.
graph LR
Dev["Developpeur"] --> Registry["Registry\n(npm, PyPI, Maven)"]
Registry --> Build["Build / CI"]
Build --> Deploy["Deploiement"]
Attacker["Attaquant"] -.->|"paquet malveillant"| Registry
Attacker -.->|"compromis build"| Build
Attacker -.->|"dependance transitive"| Registry
style Attacker fill:#c0392b,color:#fff Risques principaux¶
| Risque | Description | Exemple réel |
|---|---|---|
| Typosquatting | Paquet avec nom similaire au paquet legitime | reqeusts au lieu de requests |
| Paquet abandonne | Mainteneur inactif, vulnérabilités non patchees | event-stream (npm, 2018) |
| Dépendance transitive | Votre code est sur, mais une dépendance de dépendance ne l'est pas | Log4Shell via Log4j |
| Compte mainteneur compromis | Token npm/PyPI vole, mise à jour malveillante publiee | ua-parser-js (2021) |
| Confusion de noms | Paquet interne publie sur un registry public avec un nom conflit | Attaque Alex Birsan (2021) |
| Build compromise | CI/CD infecte, artefacts modifies avant publication | SolarWinds (2020) |
Lock files et version pinning¶
npm / Node.js¶
// package.json — specifier des ranges prudentes
{
"dependencies": {
"express": "^4.18.2",
"axios": "~1.6.0"
}
}
# Toujours commiter package-lock.json
# Installer exactement les versions lockees
npm ci # plus strict que npm install, utilise package-lock.json
# Verifier l'integrite des paquets installes
npm audit
Python / pip¶
# Generer un requirements.txt avec versions exactes
pip freeze > requirements.txt
# requests==2.31.0
# cryptography==41.0.7
# Ou avec pip-tools pour separer les deps directes des transitives
pip-compile requirements.in # genere requirements.txt avec hashes
pip-sync requirements.txt # installe exactement ce qui est specifie
Hash vérification¶
# pip avec verification de hash (recommande en prod)
pip install --require-hashes -r requirements.txt
# requirements.txt avec hashes
# requests==2.31.0 \
# --hash=sha256:58cd2187423839ea9f2cc8e7b... \
# --hash=sha256:942c5a758f98d790eaed1a29c...
SBOM : Software Bill of Materials¶
Le SBOM est une liste exhaustive de tous les composants logiciels d'une application — l'équivalent d'une liste d'ingredients pour le logiciel.
Formats standards¶
| Format | Organisation | Points forts |
|---|---|---|
| CycloneDX | OWASP | Support large, integrations CI/CD, VEX support |
| SPDX | Linux Foundation | Standard ISO/IEC 5962, très utilisé en legal |
Générer un SBOM¶
# Python avec cyclonedx-bom
pip install cyclonedx-bom
cyclonedx-py environment -o bom.json --format json
# Node.js avec CycloneDX
npx @cyclonedx/cyclonedx-npm --output-file bom.json
# Docker avec syft (multi-ecosystemes)
syft myimage:latest -o cyclonedx-json > bom.json
# Go
cyclonedx-gomod mod -output bom.xml
Vérifier les vulnérabilités dans le SBOM¶
# grype — scanner de vulnerabilites a partir d'un SBOM
grype sbom:bom.json
# ou directement sur une image
grype myimage:latest
# Output exemple:
# NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
# openssl 3.0.2 3.0.7 deb CVE-2022-3786 Critical
Vérification d'intégrité et signatures¶
Sigstore / cosign (images Docker)¶
# Signer une image apres le build
cosign sign --key cosign.key myregistry/myimage:v1.0.0
# Verifier avant de deployer
cosign verify --key cosign.pub myregistry/myimage:v1.0.0
# Verification dans Kubernetes via policy (Kyverno, OPA)
NPM provenance (2023+)¶
# Publier avec provenance (lie le paquet au commit GitHub)
npm publish --provenance
# Verifier la provenance d'un paquet
npm audit signatures
Mises à jour automatisees¶
Dependabot (GitHub)¶
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
groups:
dev-dependencies:
dependency-type: "development"
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
Renovate¶
Plus configurable que Dependabot, supporte le groupement de PRs et les stratégies de merge automatique.
// renovate.json
{
"extends": ["config:base"],
"automerge": true,
"automergeType": "pr",
"packageRules": [
{
"matchUpdateTypes": ["patch"],
"automerge": true
},
{
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["major-update"]
}
]
}
Stratégie de mise à jour
- Patches : merge automatique après CI verte
- Mineurs : review rapide, merge en batch hebdomadaire
- Majeurs : migration planifiee, tests etendus
OpenSSF Scorecard¶
Outil d'évaluation de la sécurité d'un projet open source sur 18 critères.
# Evaluer un projet
scorecard --repo github.com/org/project --show-details
# Criteres evalues (score 0-10) :
# - Branch-Protection : branches protegees ?
# - Code-Review : PRs reviewees ?
# - Dependency-Update-Tool : Dependabot/Renovate configure ?
# - Signed-Releases : releases signees ?
# - Token-Permissions : tokens CI avec moindres privileges ?
# - Vulnerabilities : CVE connues ouvertes ?
Synthèse risques et mitigations¶
| Risque | Mitigation | Outil recommande |
|---|---|---|
| Typosquatting | Vérifier le nom, l'auteur, les stats | npm audit, PyPI inspector |
| Paquet abandonne | Checker last commit, nb mainteneurs | Snyk, Socket.dev |
| Vulnérabilité connue | Scanner régulièrement le SBOM | grype, trivy, snyk |
| Dépendance transitive | SBOM complet, lock files | cyclonedx, syft |
| Image Docker compromise | Signature cosign, scan avant deploy | cosign, trivy |
| Build compromise | SLSA provenance, artefacts signes | slsa-github-generator |
Chapitre suivant : SAST et DAST — intégrer l'analyse de sécurité statique et dynamique dans votre CI.