Fuite de clé maître LiteLLM : comment des attaquants ont détourné le pipeline de livraison et volé des jetons GitHub
Célestine Rochefour
En octobre 2026, une clé maîtresse non révoquée, exposée par erreur cinq mois plus tôt, a permis à un attaquant de prendre le contrôle du pipeline de livraison de LiteLLM, une passerelle open source populaire pour les grands modèles de langage (LLM). Cet incident illustre de manière frappante les risques liés à une gestion laxiste des secrets et à une chaîne d’approvisionnement logicielle mal sécurisée. Selon le rapport de l’équipe de sécurité de LiteLLM, l’attaquant a réussi à publier une version malveillante du package Python sur PyPI, Docker Hub et GitHub Container Registry, compromettant potentiellement des milliers d’environnements de développement et de production.
Nous analysons en détail la chronologie, les mécanismes de la compromission et les leçons à en tirer pour renforcer la sécurité de votre chaîne logitielle.
Le contexte : LiteLLM, une passerelle LLM devenue cible
LiteLLM est un outil open source qui permet d’interfacer facilement des modèles de langage propriétaires et open source. Adopté par de nombreuses entreprises, il est maintenu par l’organisation BerriAI. Le 27 mai 2026, un fichier de configuration a été commité accidentellement dans le dépôt public LiteLLM-Labs/lite-harness. Ce fichier contenait la clé maîtresse d’un déploiement de l’Agent Platform LiteLLM, une plateforme interne utilisée pour orchestrer des agents LLM.
“L’erreur a été rapidement identifiée, le commit a été écrasé par un force-push, et nous avons repéré les clés exposées comme nécessitant une révocation. Cependant, la révocation de la clé maîtresse n’a pas eu lieu”, explique Oliver Jensen, co-fondateur de LiteLLM. Ce manquement a ouvert la porte à une attaque cinq mois plus tard.
“Nous avons immédiatement agi pour supprimer le commit, mais nous n’avons pas révoqué la clé maîtresse. C’est cette négligence qui a permis l’attaque.” - Oliver Jensen, LiteLLM
Le scénario de l’attaque : de la fuite à la compromission du pipeline
Exploitation de la clé maîtresse et vol du jeton OAuth GitHub
Le 10 octobre 2026, un attaquant opérant depuis l’adresse IP 69.48.229.143 a utilisé la clé maîtresse non révoquée pour accéder à l’Agent Platform LiteLLM. Une fois dedans, il a extrait un jeton OAuth GitHub CLI que la plateforme utilisait pour permettre à des agents cloud de soumettre des pull requests vers les dépôts GitHub de l’organisation.
Ce jeton n’était pas limité dans ses permissions : il était associé au compte du propriétaire de l’organisation GitHub BerriAI, offrant un accès propriétaire à tous les dépôts. Comme le soulignent les développeurs de LiteLLM, “le jeton n’était pas restreint et donnait un accès de niveau propriétaire à l’ensemble des dépôts”.
Création de workflows malveillants pour exfiltrer d’autres secrets
En possession de ce jeton surpuissant, l’attaquant a alors mené des opérations en deux phases :
Le 10 octobre 2026, entre 22h11 et 22h12 UTC : il a créé des branches poubelles (throwaway) dans les dépôts internes BerriAI/litellm et BerriAI/litellm-auto, avec des commits ajoutant un fichier
.github/workflows/cache.ymlmalveillant. Ce workflow, déclenché automatiquement sur chaque push, était conçu pour voler les jetons GitHub CLI de deux ingénieurs disposant de privilèges de mainteneur, via un endpointwebhook.sitecontrôlé par l’attaquant. Les deux runs ont été supprimés quelques minutes plus tard.Le 21 octobre 2026, entre 10h08 et 11h08 UTC : l’attaquant a utilisé l’un des jetons dérobés pour outrepasser la protection de branche et modifier le pipeline de release. Il a redirigé la source vers un dépôt homonyme malveillant Berri-AI/litellm (notez le tiret au lieu du vrai nom BerriAI). Il a ensuite déclenché une release à l’aide d’un premier jeton, puis approuvé avec un second, car la politique exigeait deux approbations. La restriction avait été assouplie quelques jours plus tôt pour permettre des releases plus fréquentes, ce qui a facilité l’attaque.
| Événement clé | Date et heure (UTC) |
|---|---|
| Fuite initiale de la clé maîtresse | 27 mai 2026 |
| Première exploitation par l’attaquant | 10 oct. 2026, 22h11-22h12 |
| Altération du pipeline de release | 21 oct. 2026, 10h08-11h08 |
| Publication de la version 1.107.0 sur PyPI | 21 oct. 2026, 11h39-11h40 |
| Publication sur Docker Hub et GHCR | 21 oct. 2026, 11h46 |
| Signalement par Upwind (Lidor Machluf) | 21 oct. 2026, 12h06 |
| Quarantaine sur PyPI | 21 oct. 2026, 13h23 |
| Nettoyage des tags Docker Hub | 21 oct. 2026, 14h20 |
Analyse des workflows malveillants : une moisson de credentials sophistiquée
Les workflows .github/workflows/cache.yml ont été examinés par Socket, une société de sécurité applicative. Selon Karlo Zanki, chercheur chez Socket, deux commits malveillants ont été créés : l’un le 10 octobre, l’autre le 12 octobre. Chacun était poussé sur une branche éphémère ci-tmp-<hex> basée sur un commit légitime récent, puis supprimé après exécution.
“Ni l’un ni l’autre des commits n’était poussé sur une branche qui existe encore. Les branches étaient créées, utilisées et supprimées en quelques minutes, laissant très peu de traces dans l’historique ordinaire du dépôt.” - Karlo Zanki, Socket
Ces workflows étaient configurés pour collecter un large éventail de secrets :
- Jetons GitHub et clés privées d’applications GitHub
- Clés API pour Together AI, Anthropic, OpenAI, AWS Bedrock
- Identifiant et clé de signature d’une GitHub App
- Chaîne de connexion PostgreSQL (nom d’utilisateur, mot de passe)
- Adresse, port et mot de passe Redis
- État de stockage Playwright (permettant un accès sans MFA à Linear)
- Jeton GitGuardian (la plateforme de détection de secrets elle-même)
- Jeton Linear, clés API Tavily, etc.
Les données exfiltrées étaient envoyées vers deux endpoints webhook.site distincts. La collecte incluait des credentials de la plateforme de détection de secrets GitGuardian, ce qui aurait pu permettre à l’attaquant de masquer ses activités en manipulant les alertes.
La version malveillante 1.107.0 : un logiciel malveillant furtif
Le package publié sous le nom litellm version 1.107.0 contenait bien plus qu’une simple mise à jour. Il intégrait un voleur de credentials et une backdoor Unix, conçus pour s’exécuter automatiquement au démarrage de Python, même si LiteLLM n’était pas importé. Les chercheurs de Microsoft Security Research ont détaillé ce mécanisme :
“Les fichiers de démarrage résidaient en dehors du répertoire de l’application LiteLLM. Supprimer simplement les fichiers de l’application ne suffisait pas à éliminer les composants malveillants.” - Microsoft Security Research
Le malware possédait deux voies d’exécution :
Module de vol de credentials : il ciblait les fichiers de configuration de développeurs (SSH, Git, GitLab, npm, PyPI, pip, Yarn, Maven, Gradle, Composer, RubyGems, Cargo), les variables d’environnement, les tokens de services cloud et les sessions de navigateur. Les données étaient compressées et envoyées par HTTP POST à
litellm.dev/healthcheck(domaine enregistré le 13 octobre 2026).Backdoor Unix : lancée en tâche de fond, elle récupérait et exécutait du code arbitraire fourni par l’attaquant toutes les heures, offrant un contrôle persistant.
Conséquence alarmante : tout environnement exécutant Python, même sans importer LiteLLM, pouvait activer le code malveillant. Cela étendait considérablement la surface d’impact au-delà des utilisateurs directs de la passerelle.
Les enseignements pour la sécurité des chaînes d’approvisionnement logicielle
Cet incident n’est pas un cas isolé. Selon un rapport de Sonatype en 2025, les attaques sur la chaîne d’approvisionnement open source ont augmenté de 315 % en trois ans. L’affaire LiteLLM met en lumière plusieurs failles récurrentes :
Gestion des secrets : la clé maîtresse non révoquée
- Ne jamais différer une révocation : dès qu’un secret est suspecté d’avoir été exposé, même après un force-push, il doit être immédiatement révoqué. LiteLLM a reconnu que la clé maîtresse n’a pas été révoquée, une erreur humaine aux conséquences désastreuses.
- Utiliser des tokens à permissions minimales : le jeton OAuth GitHub volé possédait un accès propriétaire non restreint. Les jetons d’automatisation doivent être limités aux dépôts et actions strictement nécessaires.
Sécurisation du pipeline CI/CD
- Protection des branches et politique d’approbation : l’assaissement temporaire des règles d’approbation pour des releases plus fréquentes a ouvert une brèche. Toute exception doit être assortie de contrôles supplémentaires (MFA obligatoire, vérification d’intégrité).
- Surveillance des branches éphémères : les branches
ci-tmp-*créées et supprimées rapidement sont un signal d’alerte. Les workflows doivent être vérifiés avant exécution, surtout s’ils sont ajoutés via des branches non protégées. - Analyse des dépendances et des workflows : intégrer des outils de détection de secrets (comme GitGuardian, mais celui-ci a été contourné) et une analyse statique des workflows CI.
Réponse aux incidents et transparence
- Communication rapide : LiteLLM a publié un rapport détaillé, permettant à la communauté de comprendre l’attaque et de s’en protéger. Cette transparence est essentielle pour la confiance.
- Révocation systématique : après l’incident, LiteLLM a révoqué tous les tokens internes et externes. C’est une étape coûteuse mais nécessaire.
Recommandations pratiques pour les organisations
Voici une liste de mesures concrètes à mettre en œuvre dès aujourd’hui :
- Auditez tous les secrets exposés publiquement : utilisez des scanners comme GitLeaks, TruffleHog ou GitHub secret scanning. Ne vous fiez pas uniquement au force-push : le secret a peut-être déjà été récupéré.
- Implémentez une rotation automatique des clés : pour les clés maîtresses et les tokens à longue durée de vie, programmez une révocation et un renouvellement périodique.
- Utilisez des tokens à courte durée de vie : préférez des jetons OAuth avec des permissions fines (par exemple, jeton d’accès à un seul dépôt, durée de quelques heures).
- Appliquez le principe du moindre privilège : les jetons d’automatisation ne doivent jamais avoir les droits d’un propriétaire. Créez des robots GitHub avec des rôles spécifiques.
- Sécurisez les runners auto-hébergés : si vous utilisez des agents cloud, assurez-vous que leurs secrets sont en lecture seule et que leur accès réseau est restreint.
- Surveillez les anomalies dans les workflows : analysez les logs de GitHub Actions pour détecter des branches éphémères, des commits non attachés à des PR, ou des endpoints de callback inconnus.
- Testez la robustesse de votre pipeline : réalisez des exercices de type “table rouge” simulant une compromission de clé pour valider vos procédures de réponse.
Conclusion : une leçon qui doit profiter à tous
La fuite de clé maître LiteLLM et la compromission de son pipeline de livraison illustrent les conséquences d’une négligence dans la gestion des secrets et les failles d’une chaîne d’approvisionnement mal sécurisée. En combinant un secret non révoqué, un jeton surpuissant, un assouplissement des règles et une absence de détection, l’attaquant a pu déployer un paquet malveillant qui aurait pu infecter des milliers de systèmes.
“Nous avons appris que chaque secret, même temporaire, doit être traité comme critique et révoqué immédiatement après son exposition”, admet l’équipe LiteLLM. À l’heure où les attaques par chaîne d’approvisionnement se multiplient, chaque organisation doit tirer les leçons de cet incident et renforcer en priorité :
- La gestion centralisée des secrets
- La vérification systématique des pipelines CI/CD
- La formation des développeurs aux risques liés aux token exposés
Ne sous-estimez pas l’impact d’une clé maîtresse non révoquée. Comme le montre cette affaire, elle peut transformer une simple erreur en une brèche majeure. Agissez dès maintenant pour auditer vos secrets, durcir vos pipelines et adopter une culture de la sécurité proactive.
Pour aller plus loin, consultez le rapport détaillé de LiteLLM (disponible sur leur blog) ainsi que les analyses de Socket et de Microsoft Security Research. La sécurité d’une chaîne d’approvisionnement ne tient qu’à un maillon : celui de la vigilance.