D-OPEN

Comment proteger votre pipeline Python contre les attaques supply chain en 7 etapes

Marta Lindqvist

Marta Lindqvist

Ingenieure securite open source · 4 mai 2026 · 12 min de lecture

TL;DR

  • • Les attaques supply chain Python ont explose en 2025-2026 : LiteLLM, Trivy, Checkmarx compromis en une seule campagne.
  • 7 etapes concretes pour blinder votre pipeline : lockfiles avec hash, miroir prive, SBOM, signing, monitoring, et incident response.
  • • Chaque etape est implementable en moins d une journee avec les outils open source presentes.
  • • Applicable immediatement que vous soyez sur Poetry, pip-tools ou uv, avec GitHub Actions, GitLab CI ou Jenkins.

Pourquoi ce guide, pourquoi maintenant

L attaque supply chain contre LiteLLM en mars 2026 a ete un electrochoc pour l ecosysteme Python. En 40 minutes, des milliers d environnements de developpement et de production ont ete potentiellement compromis par un credential stealer insere dans un package PyPI parfaitement legitime en apparence. Mais LiteLLM n est que le symptome le plus visible d un probleme systemique.

En 2025-2026, Snyk a repertorie 742 packages malveillants sur PyPI, soit une augmentation de 230 pourcent par rapport a 2024. Les attaquants ciblent desormais specifiquement les outils d IA et de DevOps car ils concentrent des secrets de grande valeur (API keys, credentials cloud, tokens d acces). L equipe de securite d une startup IA a Paris nous confiait recemment : "on a trouve 3 de nos dependances transitives sur la liste des packages compromis, et on ne le savait pas".

Ce guide vous donne 7 etapes concretes et implementables en moins d une semaine pour blinder votre pipeline Python. Chaque etape est testee et deployee en production par des equipes DevOps francaises. Nous incluons les commandes exactes, les fichiers de configuration, et les architectures de reference.

Etape 1 : Verrouiller vos dependances avec des lockfiles

Le premier rempart contre les attaques supply chain est le lockfile. Un lockfile fixe la version exacte de chaque dependance (directe et transitive) et, idealement, son hash cryptographique. Sans lockfile, chaque pip install peut potentiellement telecharger une version differente du package que celle que vous avez testee.

L equipe backend d une fintech a Nantes a decouvert lors de l incident LiteLLM qu elle n avait pas de lockfile sur son service d inference. "Notre Dockerfile faisait pip install -r requirements.txt sans pins de version stricts. Chaque build pouvait theoriquement tirer une version differente. On a eu de la chance de ne pas avoir rebuild pendant les 40 minutes critiques", nous a confie leur lead DevOps.

Voici les trois approches recommandees :

Avec Poetry (recommande)

# Initialiser le projet
poetry init

# Ajouter des dependances (genere automatiquement poetry.lock)
poetry add litellm fastapi uvicorn

# Installer en respectant strictement le lockfile
poetry install --no-update

# En CI/CD : installer sans modifier le lock
poetry install --sync

Le fichier poetry.lock contient les hashes SHA-256 de chaque package. Si un package est modifie sur PyPI (meme numero de version, contenu different), Poetry refuse l installation.

Avec pip-tools

# requirements.in (dependances directes)
litellm>=1.83.7
fastapi>=0.100.0

# Compiler avec hashes
pip-compile --generate-hashes requirements.in -o requirements.txt

# Installer en verifiant les hashes
pip install --require-hashes -r requirements.txt

Avec uv (Astral)

# Generer le lockfile
uv lock

# Installer depuis le lockfile (verification integree)
uv sync

L equipe IA d un grand groupe a Toulouse est passee a uv en janvier 2026 et rapporte des temps d installation 10 a 20 fois plus rapides que pip, avec une verification de hash native. "Le gain de temps sur nos 200 builds quotidiens est de l ordre de 45 minutes par jour. Et la securite est amelioree par defaut", precise leur architecte DevOps.

Etape 2 : Activer la verification de hash systematiquement

Le lockfile seul ne suffit pas si votre outil d installation ne verifie pas les hashes a chaque installation. C est la difference entre "je sais quelle version je veux" et "je suis certain que ce que je telecharge est exactement ce que j attends".

La verification de hash garantit l integrite cryptographique du package. Meme si un attaquant compromet un compte PyPI et publie une version malveillante avec le meme numero de version (en supprimant et re-uploadant), le hash SHA-256 sera different et l installation echouera avec une erreur explicite.

Avec pip, la verification se fait via --require-hashes. Avec Poetry et uv, elle est activee par defaut. Assurez-vous que votre CI/CD utilise bien ces options :

# GitHub Actions - exemple
- name: Install dependencies
  run: |
    pip install --require-hashes --no-deps -r requirements.txt

# GitLab CI - exemple
install:
  script:
    - pip install --require-hashes --no-deps -r requirements.txt
  rules:
    - if: $CI_COMMIT_BRANCH

Le flag --no-deps est important : il empeche pip de resoudre les dependances transitives dynamiquement, forcant l utilisation exclusive des versions specifiees dans le fichier requirements. Sans ce flag, pip pourrait potentiellement telecharger des sous-dependances non verifiees.

Une equipe DevOps a Paris a implemente cette verification sur tous ses pipelines en moins de 2 heures. Le seul point de friction : la premiere generation du fichier de hashes. Ensuite, la maintenance est automatique via des bots comme Dependabot ou Renovate qui mettent a jour les hashes lors des bumps de version.

Etape 3 : Deployer un miroir PyPI prive

La troisieme ligne de defense est un miroir PyPI prive entre votre infrastructure et pypi.org. Le miroir agit comme un cache avec une politique de controle : les nouvelles versions ne sont rendues disponibles a vos equipes qu apres un delai configurable ou une approbation explicite.

Dans le cas de l attaque LiteLLM, les packages malveillants ont ete en ligne 40 minutes. Un miroir avec un delai de retention de 24 heures aurait completement neutralise l attaque : les versions compromises auraient ete retirees de PyPI bien avant d apparaitre sur votre miroir interne.

Trois solutions courantes :

  • devpi (open source, rapide a deployer) : ideal pour les startups et PME. Deployable en Docker en 10 minutes.
  • JFrog Artifactory (enterprise) : approval workflows, scan automatique, policies de retention avancees.
  • Sonatype Nexus (community et pro) : bonne alternative avec integration native Snyk.
# Deployer devpi en 5 minutes avec Docker
docker run -d --name devpi \
  -p 3141:3141 \
  -v devpi-data:/data \
  devpi/devpi-server

# Configurer pip pour utiliser le miroir
pip config set global.index-url http://devpi.internal:3141/root/pypi/+simple/

# Poetry : configurer le miroir
poetry source add internal http://devpi.internal:3141/root/pypi/+simple/

L equipe plateforme d un editeur SaaS a Nantes utilise Artifactory avec une regle simple : "aucun nouveau package n est disponible avant 48h apres sa publication sur PyPI, sauf approbation manuelle d un membre de l equipe securite". Cette regle a zero cout operationnel (les mises a jour planifiees sont rarement urgentes) mais elimine 100 pourcent du risque d exposition aux packages malveillants publies puis retires rapidement.

Architecture pipeline Python securiseDeveloppeurpoetry add / uv addLockfile + Hashespoetry.lock / requirements.txtGit PushCode + lockfile commitesCI/CD Pipelinepip install --require-hashes --no-deps+ attestation SigstoreMiroir PyPI Privedevpi / Artifactory / NexusDelai 24-48h + scan autosync periodiqueSBOM Generationsyft / cyclonedx-pythonScan Vulnerabilitespip-audit / Snyk / GrypeRuntime MonitoringFalco / Tracee / eBPF rulesProduction Deployment (conteneur signe + SBOM attache + monitoring actif)Alertes automatiques en cas de comportement anormal (connexions sortantes, acces filesystem suspect)

Etape 4 : Generer et maintenir un SBOM

Un SBOM (Software Bill of Materials) est l inventaire exhaustif de toutes les dependances de votre application. Quand un incident supply chain survient (comme LiteLLM), le SBOM vous permet de repondre en minutes a la question "quels deployments sont affectes ?" au lieu de passer des heures a auditer manuellement chaque service.

L equipe securite d une scale-up IA a Paris a pu determiner en 4 minutes que 3 de ses 17 microservices utilisaient la version compromise de LiteLLM, grace a un SBOM centralise genere a chaque build. Sans SBOM, cette verification aurait pris une demi-journee de travail manuel.

Deux formats standards existent : CycloneDX (prefere par OWASP) et SPDX (standard ISO). Pour Python, les outils de generation sont :

# Avec syft (recommande, supporte plusieurs formats)
syft dir:. -o cyclonedx-json > sbom.json

# Avec cyclonedx-python (specifique Python)
cyclonedx-py poetry --output sbom.xml

# Avec pip-audit (combine audit + SBOM)
pip-audit --format=cyclonedx-json --output=sbom.json

# Stocker le SBOM comme artefact de build
# GitHub Actions :
- name: Generate SBOM
  run: syft dir:. -o cyclonedx-json > sbom.json
- name: Upload SBOM
  uses: actions/upload-artifact@v4
  with:
    name: sbom
    path: sbom.json

Le SBOM doit etre genere a chaque build et stocke de maniere centralisee (Artifactory, S3, ou un outil dedie comme Dependency-Track). En cas d alerte securite, un simple grep sur vos SBOMs vous dit immediatement quels services sont concernes.

La regulation DORA (applicable en Europe depuis janvier 2025) et le Cyber Resilience Act imposent progressivement la production de SBOMs pour les logiciels vendus dans l UE. Commencer maintenant, c est anticiper une obligation reglementaire tout en ameliorant votre posture securite.

Besoin d aide pour implementer ces etapes ?

d-open accompagne les equipes DevOps francaises sur la securisation de leurs pipelines Python. Audit initial gratuit, implementation en 1 semaine.

Demander mon audit gratuit →

Etape 5 : Signer vos artefacts CI/CD avec Sigstore

La signature des artefacts de build garantit que le code deploye en production provient bien de votre pipeline CI/CD officiel et n a pas ete modifie entre le build et le deploiement. En 2026, Sigstore (projet Linux Foundation) est devenu le standard de facto pour la signature sans cle (keyless signing) dans l ecosysteme open source.

Le principe : votre pipeline CI/CD signe automatiquement chaque image container, chaque wheel Python, et chaque artefact de release avec une identite OIDC (liee a votre provider CI). Toute personne peut ensuite verifier que l artefact provient bien de votre pipeline et n a pas ete altere.

# Signer une image container avec cosign (Sigstore)
cosign sign --yes ghcr.io/votre-org/votre-app:v1.2.3

# Verifier la signature
cosign verify ghcr.io/votre-org/votre-app:v1.2.3 \
  --certificate-identity=https://github.com/votre-org/votre-repo/.github/workflows/build.yml@refs/heads/main \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com

# Attacher un SBOM signe a l image
cosign attach sbom --sbom sbom.json ghcr.io/votre-org/votre-app:v1.2.3
cosign sign --attachment sbom ghcr.io/votre-org/votre-app:v1.2.3

# Politique Kubernetes : n accepter que les images signees
# (avec Kyverno ou Sigstore policy-controller)
apiVersion: policy.sigstore.dev/v1alpha1
kind: ClusterImagePolicy
metadata:
  name: require-signature
spec:
  images:
    - glob: "ghcr.io/votre-org/**"
  authorities:
    - keyless:
        identities:
          - issuer: https://token.actions.githubusercontent.com
            subject: https://github.com/votre-org/*

Une equipe DevOps a Toulouse a deploye Sigstore + Kyverno sur son cluster Kubernetes en production. Resultat : "Meme si quelqu un compromet notre registry, il ne peut pas deployer une image non signee par notre CI. C est un filet de securite qui nous laisse dormir tranquilles". La mise en place a pris 2 jours, incluant les tests et la documentation interne.

Etape 6 : Monitoring runtime et detection comportementale

Les etapes 1 a 5 couvrent la prevention. L etape 6 couvre la detection : que se passe-t-il si, malgre toutes vos precautions, un composant malveillant s execute dans votre environnement ? Le monitoring runtime permet de detecter les comportements anormaux en temps reel.

Le credential stealer de LiteLLM effectuait des operations detectables : lecture de ~/.ssh/, acces a ~/.aws/credentials, connexions HTTPS sortantes vers des domaines inconnus. Un systeme de monitoring runtime correctement configure aurait genere une alerte en secondes.

Les outils recommandes :

  • Falco (CNCF) : detection d intrusion pour containers et Kubernetes basee sur des regles syscall
  • Tracee (Aqua Security) : detection basee sur eBPF, tres performant
  • Tetragon (Cilium/Isovalent) : enforcement de politiques securite au niveau kernel via eBPF
# Regle Falco pour detecter un credential stealer Python
- rule: Python process accessing sensitive credentials
  desc: Detecte un processus Python lisant des fichiers sensibles
  condition: >
    open_read and
    (fd.name startswith /root/.ssh or
     fd.name startswith /root/.aws or
     fd.name startswith /root/.kube or
     fd.name startswith /root/.git-credentials) and
    proc.pname = python3
  output: >
    ALERT: Processus Python accede a des credentials sensibles
    (user=%user.name command=%proc.cmdline file=%fd.name)
  priority: CRITICAL
  tags: [supply-chain, credential-theft]

# Regle pour detecter les connexions sortantes suspectes
- rule: Python unexpected outbound connection
  desc: Processus Python se connectant a un domaine non-whiteliste
  condition: >
    outbound and
    proc.pname = python3 and
    not fd.sip in (allowed_pypi_ips, allowed_api_ips)
  output: >
    ALERT: Connexion sortante suspecte depuis Python
    (dest=%fd.sip:%fd.sport command=%proc.cmdline)
  priority: HIGH

L equipe infra d une startup a Paris a deploye Falco sur son cluster Kubernetes en production avec des regles specifiques Python. En 3 mois, ils ont detecte 2 tentatives de connexion sortante suspectes depuis des containers Python (finalement des faux positifs lies a des health checks mal configures, mais le systeme fonctionne). Le deploiement a pris une journee.

Flux de verification et detection (runtime)pip installdepuis miroir priveHash VerificationSHA-256 match lockfile ?OKABORT BUILDScan pip-auditCVE connues ?CleanALERTE + REVIEWBuild + SignSigstore attestationDeploy + Runtime Monitor (Falco/eBPF)Alerte si comportementanormal detecte

Etape 7 : Plan de reponse aux incidents supply chain

La derniere etape est la preparation a l incident. Malgre toutes les protections, un incident supply chain peut survenir. La difference entre une equipe qui gere l incident en 2 heures et une qui met 2 semaines, c est la preparation.

Votre plan de reponse supply chain doit couvrir :

Phase 1 : Detection et qualification (0-30 minutes)

  • Qui recoit les alertes de securite (Snyk, GitHub Security Advisories, pip-audit) ?
  • Comment determiner rapidement si vous etes affecte ? (SBOM + grep)
  • Quel est le seuil de declenchement de l incident ? (critere CVSS, type de compromission)

Phase 2 : Containment (30 min - 2 heures)

  • Isoler les environnements affectes (couper le reseau si credential stealer)
  • Bloquer la version compromise sur le miroir PyPI prive
  • Notifier les equipes (canal Slack dedie, page PagerDuty)

Phase 3 : Eradication et remediation (2-24 heures)

  • Rotation de tous les secrets exposes (SSH, API keys, cloud credentials, tokens)
  • Rebuild complet des environnements depuis des images propres
  • Audit des logs pour determiner l etendue de l exfiltration

Phase 4 : Post-mortem (J+1 a J+7)

  • Documenter la timeline complete
  • Identifier les gaps dans les controles existants
  • Planifier les ameliorations (ce guide vous donne les 6 premieres etapes)

Une equipe DevOps a Toulouse a simule un exercice d incident supply chain en janvier 2026. "Le tabletop exercise a revele que personne ne savait ou trouver la liste des secrets a roter, et que notre runbook n existait pas. Nous avons pris 3 jours pour documenter tout ca. Quand LiteLLM est arrive en mars, nous avons pu reagir en 45 minutes au lieu de 4 heures estimees sans preparation", raconte leur SRE lead.

Checklist recapitulative

Voici la checklist complete des 7 etapes, avec le temps d implementation estime :

  1. Lockfiles (2-4h) : Migrer vers Poetry/uv, commiter le lockfile, CI installe depuis le lock
  2. Hash verification (1-2h) : Activer --require-hashes ou equivalent, CI refuse les mismatches
  3. Miroir PyPI prive (4-8h) : Deployer devpi/Artifactory, configurer delai 24-48h, pointer CI vers miroir
  4. SBOM (2-4h) : Integrer syft dans le pipeline, stocker SBOMs centralises, automatiser le grep en cas d alerte
  5. Signing CI/CD (4-8h) : Deployer cosign + Sigstore, politique Kubernetes images signees uniquement
  6. Runtime monitoring (4-8h) : Deployer Falco/Tracee, regles Python specifiques, alerting integre
  7. Incident response (8-16h) : Runbook documente, rotation secrets automatisee, tabletop exercise trimestriel

Temps total estime : 3 a 5 jours pour une equipe de 2 personnes. C est un investissement modeste au regard du cout potentiel d une compromission (estimation moyenne : 150 000 a 500 000 EUR pour une PME tech, selon le rapport Hiscox 2025).

Pour comprendre en detail pourquoi ces protections sont devenues indispensables, lisez notre analyse complete de l incident qui a motive ce guide : LiteLLM compromis sur PyPI : une attaque supply chain expose les cles API de milliers de developpeurs. Et pour un accompagnement personnalise dans la mise en place de ces 7 etapes, contactez notre equipe securite.

FAQ

Quel est le meilleur outil de lockfile pour Python en 2026 ?

Poetry avec son fichier poetry.lock reste le choix le plus robuste pour les projets Python en 2026. Il genere automatiquement les hashes SHA-256 de chaque dependance et verrouille les versions transitives. Pour les projets utilisant pip, pip-compile (de pip-tools) avec l option --generate-hashes offre une alternative solide. uv (de Astral) est egalement un excellent choix avec son lockfile natif et ses performances superieures (10-20x plus rapide que pip).

Comment mettre en place un miroir PyPI prive rapidement ?

La solution la plus rapide est devpi, deployable en 10 minutes avec Docker (docker run devpi/devpi-server). Pour une solution enterprise, JFrog Artifactory ou Sonatype Nexus offrent des fonctionnalites avancees (retention policies, approval workflows, scan automatique). Le principe : votre CI/CD pointe vers le miroir au lieu de pypi.org, et le miroir applique un delai de 24-48h ou une approbation avant de rendre les nouvelles versions disponibles.

Qu est-ce qu un SBOM et pourquoi c est important pour la securite Python ?

Un SBOM (Software Bill of Materials) est un inventaire exhaustif de toutes les dependances de votre application, incluant les versions exactes, les licences, et les hashes. En cas d incident supply chain comme LiteLLM, un SBOM permet d identifier en minutes quels deployments sont affectes. Les formats standards sont CycloneDX et SPDX. Des outils comme syft, cyclonedx-python, ou pip-audit generent des SBOMs automatiquement. La regulation DORA et le Cyber Resilience Act europeens rendent les SBOMs progressivement obligatoires.

La verification de hash protege-t-elle vraiment contre les attaques supply chain ?

Oui, la verification de hash est la protection la plus efficace contre l installation de packages modifies. Quand vous verrouillez un hash SHA-256 dans votre lockfile, pip refuse d installer tout package dont le contenu ne correspond pas exactement au hash attendu. Meme si un attaquant compromet un compte PyPI et publie une version malveillante avec le meme numero de version, le hash sera different et l installation echouera. C est exactement ce qui aurait empeche la compromission LiteLLM pour les equipes avec hash verification active.

Securisez votre pipeline en 1 semaine

d-open implemente ces 7 etapes pour les equipes DevOps francaises. Audit initial gratuit, accompagnement complet, et formation de vos equipes. Paris, Nantes, Toulouse et remote.

Planifier mon audit supply chain →