Aller au contenu

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.