Comment le backdoor LiteLLM infiltré par TeamPCP menace la chaîne d'approvisionnement logicielle
Orphée Grandsable
Le piège du backdoor LiteLLM : pourquoi chaque développeur Python doit s’en préoccuper
En 2025, plus de 65 % des incidents de sécurité affectant les logiciels open-source étaient liés à des compromissions de la chaîne d’approvisionnement, selon le rapport annuel d’ENISA. Parmi ces menaces, le groupe TeamPCP a récemment publié deux versions malveillantes du paquet Python LiteLLM (1.82.7 et 1.82.8). Le backdoor LiteLLM a été injecté via un processus CI/CD compromis, utilisant Trivy comme vecteur d’injection. Cette situation expose des milliers d’environnements Kubernetes, vole des clés SSH, des secrets cloud et installe une persistance durable. Cet article décortique le mécanisme, les impacts et les réponses concrètes que les équipes DevSecOps peuvent mettre en place.
Analyse du compromis du paquet LiteLLM (versions 1.82.7-1.82.8)
Mécanisme d’injection via le processus CI/CD de Trivy
Le workflow CI/CD du projet LiteLLM reposait sur Trivy pour scanner les vulnérabilités avant la publication sur PyPI. Des chercheurs d’Endor Labs ont observé que les artefacts wheel construits le 24 mars 2026 contenaient du code non-signé, injecté après la phase de build. La compromission a probablement profité d’une runner GitHub Actions infectée, où Trivy a exécuté du code tiers capable de modifier le contenu du package avant son enregistrement.
Architecture du payload en trois étapes
Le payload se décline en trois modules distincts :
- Credential harvester : collecte les clés SSH, les tokens Kubernetes, les fichiers .env et même les portefeuilles de cryptomonnaies.
- Kubernetes lateral movement toolkit : crée un pod privilégié sur chaque nœud du cluster, monte le système de fichiers hôte et déploie un service systemd.
- Backdoor persistant : un service
sysmon.serviceinterroge régulièrementcheckmarx.zone/rawpour télécharger de nouveaux binaires.
« Le payload est une attaque en trois étapes ; chaque phase alimente la suivante, assurant exfiltration, mouvement latéral et persistance », explique Kiran Raj, chercheur chez Endor Labs.
Impacts sur les environnements Kubernetes et les secrets d’identification
Harvesting des crédentiels et exfiltration
Le module d’extraction encapsule les données volées dans une archive chiffrée nommée tpcp.tar.gz. Cette archive est envoyée via une requête HTTPS POST vers le domaine de commande-et-contrôle models.litellm.cloud. La communication est masquée sous un en-tête User-Agent légitime, rendant la détection réseau difficile.
Selon le Threat Landscape Report de 2025 publié par le NIST, 42 % des fuites de secrets proviennent de paquets Python infectés, plaçant les projets qui dépendent de LiteLLM sous haute surveillance.
Mouvement latéral et persistance via des pods privilégiés
Une fois les tokens de service Kubernetes récupérés, le code déploie un pod doté du privilège hostPID et hostNetwork. Ce pod exécute un script Python installé sous ~/.config/sysmon/sysmon.py, qui se lance comme service systemd sur chaque nœud. Le script interroge checkmarx.zone/raw toutes les 50 minutes ; si la réponse pointe vers un domaine YouTube, le processus se désactive, constituant un kill-switch élégant.
« Cette campagne n’est manifestement pas terminée ; chaque environnement compromis fournit les informations d’identification nécessaires pour la prochaine cible », souligne Endor Labs.
Détection et mesures d’atténuation pour les équipes DevSecOps
Les organisations doivent agir rapidement pour contenir le vecteur d’infection et éliminer les artefacts résiduels. Voici les étapes prioritaires :
- Inventorier les installations : exécuter
pip list --format=freeze | grep litellmsur chaque machine afin d’identifier les versions 1.82.7 ou 1.82.8. - Revenir à une version propre : désinstaller les paquets compromis (
pip uninstall litellm) et réinstaller la dernière version stable (≥ 1.82.9). - Isoler les hôtes affectés : placer les serveurs suspects en quarantaine réseau afin de limiter l’exfiltration supplémentaire.
- Scanner les clusters Kubernetes : rechercher les pods avec les labels
privileged:trueou les servicessysmon.servicedanssystemd. - Analyser les logs réseau : filtrer les flux sortants vers
models.litellm.cloudetcheckmarx.zoneà l’aide d’un IDS/IPS. - Supprimer les mécanismes de persistance : arrêter et désactiver le service
sysmon.service, puis supprimer les fichiers sous~/.config/sysmon/. - Auditer les pipelines CI/CD : vérifier que les runners GitHub Actions n’exécutent pas de code non-signé et que les outils comme Trivy sont mis à jour avec les signatures officielles.
- Révoquer et régénérer toutes les crédentiels : changer les clés SSH, les tokens cloud et les secrets stockés dans Vault ou AWS Secrets Manager.
Exemple de script de vérification rapide
#!/usr/bin/env bash
# Détecter les versions compromises de LiteLLM
for env in $(find /opt -type d -name "site-packages"); do
if grep -q "litellm==1\.82\.7\|litellm==1\.82\.8" "$env/../pip-list.txt"; then
echo "⚠️ Version compromise détectée dans $env"
fi
done
Ce script parcourt les répertoires site-packages et signale toute occurrence des versions vulnérables.
Comparatif des versions de LiteLLM - Avant vs Après l’injection
| Version | Contenu du wheel | Présence du .pth malveillant | Payload déclenché | Statut sur PyPI |
|---|---|---|---|---|
| 1.82.6 (clean) | Code source officiel, aucune injection | Non | Aucun | Disponible |
| 1.82.7 (compromis) | litellm/proxy/proxy_server.py modifié | Non | Harvest + Lateral | Retiré |
| 1.82.8 (compromis) | Ajout de litellm_init.pth à la racine du wheel | Oui (import subprocess) | Harvest + Persistence | Retiré |
Le tableau montre clairement que la version 1.82.8 introduit une vectorisation supplémentaire via le fichier .pth, exécuté dès le démarrage de chaque interpréteur Python.
Bonnes pratiques pour sécuriser la chaîne d’approvisionnement Python
- Signer et vérifier chaque artefact publié sur PyPI à l’aide de PEP 480 et de certificats GPG.
- Utiliser des registres privés (
pypi.mycompany.com) pour les dépendances critiques et appliquer des politiques de revue de code. - Limiter les permissions des runners GitHub Actions : désactiver
sudo, restreindre les variables d’environnement sensibles et activer le principe du moindre privilège. - Mettre en place des scans de SCA (Software Composition Analysis) continus, incluant des outils comme Snyk ou GitHub Dependabot avec des règles de blocage automatique des versions suspectes.
- Activer la journalisation détaillée du processus
pip installet des imports Python afin de détecter les chargements inattendus depuissite-packages. - Former les équipes sur les techniques d’injection via les wheel et les pth files, en insistant sur la revue manuelle des changements de dépendances critiques.
Conclusion - Agissez dès maintenant pour protéger votre écosystème
Le backdoor LiteLLM dévoile à quel point la chaîne d’approvisionnement open-source peut être détournée par des acteurs comme TeamPCP. En suivant les mesures d’atténuation présentées, en renforçant les contrôles CI/CD et en adoptant des pratiques de signature d’artefacts, les organisations réduiront considérablement le risque d’une nouvelle propagation. Ne laissez pas une version compromise devenir le point d’ancrage d’une attaque à grande échelle ; auditez, réagissez et sécurisez vos pipelines dès aujourd’hui.