Aikido

LiteLLM à nouveau compromis : un programme de vol d'informations et un RAT découverts dans la version 1.107.0

Écrit par
Ilyas Makari

Le 21 octobre 2026, il a été constaté que la version 1.107.0 de LiteLLM (un proxy open source très utilisé qui permet aux développeurs d'acheminer des requêtes vers des dizaines de fournisseurs de modèles de langage à grande échelle, ou LLM) avait été compromise par un pirate qui avait injecté du code malveillant dans ses paquets Python publiés sur PyPI. L'image Docker officielle de cette même version est également compromise.

Ce paquet contient deux composants malveillants distincts : un programme de vol d'informations qui exfiltre les identifiants et les secrets dès sa première exécution, et un cheval de Troie d'accès à distance (RAT) qui permet à l'attaquant d'exécuter à tout moment du code arbitraire sur les machines infectées.

Mise à jour : PyPI a désormais mis en quarantaine puis supprimé la version 1.107.0. L'image Docker (litellm/litellm:1.107.0) a depuis été supprimée à la fois de Docker Hub et de GHCR. GitHub a également supprimé le dépôt « dead-drop » de l'attaquant (letters9813/pythonclient-test), que le RAT utilisait pour récupérer son domaine C2.

LiteLLM a confirmé que l'incident était désormais maîtrisé. Pour obtenir les dernières informations et des conseils sur la marche à suivre si vous êtes concerné, consultez l'article de LiteLLM consacré à cet incident de sécurité. Si vous avez installé la version 1.107.0 avant son retrait, vous devez tout de même considérer que vos identifiants ont été compromis et les changer.

Qui est concerné ?

Vous êtes concerné si vous avez exécuté pip install litellm==1.107.0 entre le 21 octobre à 11 h 39 et 12 h 47 UTC, ou si vous avez récupéré l'image Docker ou GHCR via v1.107.0, dernière, dernières-actualités, ou main-stable entre le 21 octobre à 11 h 46 et 14 h 20 UTC.

Toute personne ayant effectué une installation ou une désinstallation pendant cette période doit partir du principe que ses identifiants ont été compromis et les changer immédiatement. Vérifiez si /tmp/.pc_once_* (l'exfil a déjà été lancé si ce fichier existe) et /tmp/remote_code_loader.lock (le démon C2 a tourné ou est toujours en cours d'exécution si ce fichier existe).

Ce qui s'est passé

L'attaquant a exploité une directive dans le fichier de LiteLLM pyproject.toml pour intégrer des fichiers dans les paquets « wheel » compilés sans modifier le dépôt de code source.

[tool.maturin]
data = "cook"
nom-du-module = "litellm.rust_bridge._native"

Le data = "cook" Cette directive indique à maturin (l'outil de compilation Rust/Python de LiteLLM) de regrouper le contenu d'un répertoire nommé cuisiner/ dans la section de données du fichier wheel lors de la compilation. Ce répertoire n'existe ni dans l'archive source ni sur GitHub. Il a été créé dans l'environnement de compilation compromis et son contenu a été discrètement intégré à chaque fichier wheel compilé, qui a ensuite été mis en ligne sur PyPI.

Trois fichiers malveillants ont été injectés dans le répertoire « site-packages » de Python lors de l'installation :

  • cook.pth est un fichier de 12 octets contenant uniquement import cook. Processus Python .pth fichiers dans le répertoire « site-packages » à chaque démarrage de l'interpréteur, ce qui entraîne cook.py pour s'exécuter automatiquement à chaque fois que Python est lancé sur la machine, sans que l'utilisateur ait à intervenir.
  • cook.py contient le programme de vol d'informations, fortement obscurci sous la forme d'une seule ligne qui décompresse et exécute une charge utile de 61 000 octets.
  • sitecustomize.py Il s'agit du RAT. Python exécute également ce fichier au démarrage de l'interpréteur, avant même que le code utilisateur ne soit exécuté. Ce fichier lance un démon en arrière-plan qui interroge toutes les heures l'infrastructure de l'attaquant à la recherche de nouvelles commandes à exécuter.

Ce qu'il dérobe

Une fois lancé, le programme de vol d'informations recueille les éléments suivants sur la machine infectée :

  • Informations système, notamment le nom d'hôte, le nom d'utilisateur, la version du système d'exploitation, les processus en cours d'exécution et les interfaces réseau
  • Les mots de passe enregistrés dans les navigateurs basés sur Chromium (Chrome, Edge, Brave, Vivaldi, Opera), y compris les valeurs de mots de passe déchiffrées à l'aide de l'algorithme AES, ainsi que l'historique de navigation de ces mêmes navigateurs
  • Identifiants enregistrés dans Firefox
  • Clés privées SSH provenant de ~/.ssh/
  • Historique du shell sous Bash, Zsh et Fish
  • Cloud les identifiants des fournisseurs, notamment les fichiers d'identifiants et les fichiers de configuration AWS, les jetons d'authentification Azure et le cache MSAL, ainsi que les identifiants par défaut des applications GCP. Il interroge également les points de terminaison de métadonnées des instances en cours d'exécution pour AWS, GCP et Azure afin d'extraire les identifiants disponibles pour l'instance en cours d'exécution.
  • Fichiers de configuration Docker et secrets Docker Swarm
  • Jetons de compte de service Kubernetes
  • Les secrets CI/CD, notamment les configurations des runners GitLab, les mots de passe administrateur et les clés principales de Jenkins, ainsi que les jetons HashiCorp Vault
  • Identifiants et fichiers de configuration des outils de développement pour Claude Code, Claude Desktop, Cursor, GitHub Copilot, Windsurf, Gemini CLI, Amazon Q, Codex CLI, Aider, Continue, HuggingFace et autres
  • Identifiants Git, .npmrc, .pypirc, ainsi que les fichiers de configuration de pip
  • Clés privées GPG et clés privées TLS
  • Toutes les variables d'environnement du processus actuel et, sous Linux, de tous les autres processus en cours d'exécution via /proc/<pid>/environ
  • Le contenu de la base de données LiteLLM tel quel, y compris toutes les lignes provenant de LiteLLM_CredentialsTable (clés API enregistrées pour chaque fournisseur) et LiteLLM_ProxyModelTable (configurations des modèles)

Toutes les données collectées sont chiffrées à l'aide d'une clé publique « RSA-4096 » intégrée en dur dans la charge utile, puis envoyées via une requête HTTP POST à http://www[.]litellm[.]dev/healthcheck. Veuillez noter que ce domaine est contrôlé par des pirates et n'a aucun lien avec le projet légitime LiteLLM. Un fichier sentinelle se trouve à l'adresse /tmp/.pc_once_72129118c59f5636c0bb empêche le logiciel de vol d'informations de s'exécuter plus d'une fois par ordinateur.

Cheval de Troie d'accès à distance

sitecustomize.py est exécuté automatiquement par Python au démarrage en raison de son nom de fichier, avant l'exécution de tout code utilisateur. Il lance un démon en arrière-plan qui acquiert un verrou sur /tmp/remote_code_loader.lock pour éviter la création de plusieurs instances, puis entre dans une boucle infinie.

Toutes les heures, le démon récupère le domaine C2 actuel de l'attaquant à partir d'un dépôt GitHub (raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain[.]txt), puis récupère et exécute une charge utile Python à partir de http://{domain}/codepy:

async def exec_code(code):
    loop = asyncio.get_running_loop()
    await loop.run_in_executor(
        _executor,
        lambda: exec(compile(code, "<remote>", "exec"), {"__name__": "__main__"}),
    )

Tout code Python que l'attaquant exécute sur ce point de terminaison s'exécute avec tous les privilèges du processus Python, sans aucune isolation (sandboxing). Cela permet à l'attaquant d'exécuter des commandes shell, de déposer des fichiers supplémentaires, de se déplacer latéralement, d'exfiltrer à nouveau des données ou de déployer toute autre charge utile à la demande, sur chaque machine infectée, et ce indéfiniment.

Comment Aikido détecte cela

Si vous êtes un utilisateur Aikido, vérifiez votre flux central et filtrez les problèmes de logiciels malveillants. Cela apparaîtra comme un problème critique 100/100. Aikido effectue des rescans nocturnes, mais nous vous recommandons de déclencher un rescan manuel dès maintenant.

Si vous n'êtes pas encore un utilisateur Aikido, vous pouvez créer un compte et connecter vos dépôts. Notre couverture des logiciels malveillants est incluse dans le plan gratuit, aucune carte de crédit requise.

Pour une protection future, envisagez Aikido Safe Chain (open source). Safe Chain s'intègre à votre flux de travail existant, en interceptant les commandes npm, npx, yarn, pnpm et pnpx et en vérifiant les paquets par rapport à Aikido Intel avant l'installation.

Pour une couverture plus large au sein de toute votre équipe, la Device Protection d'Aikido vous offre une visibilité et un contrôle sur les packages logiciels installés sur les appareils de votre équipe. Elle couvre les extensions de navigateur, les bibliothèques de code, les plugins d'IDE et les dépendances de build, le tout en un seul endroit. Arrêtez les malwares avant qu'ils ne soient installés.

Indicateurs de compromission

Versions des paquets concernées

  • litellm==1.107.0 Paquet PyPI installé à partir de n'importe quel fichier « wheel » compilé (tous systèmes d'exploitation)
    • litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl
      • SHA256: 7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d
    • litellm-1.107.0-cp310-abi3-macosx_11_0_arm64.whl
      • SHA256: 0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a
    • litellm-1.107.0-cp310-abi3-manylinux_2_28_x86_64.whl
      • SHA256: 462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7
    • litellm-1.107.0-cp310-abi3-manylinux_2_28_aarch64.whl
      • SHA256: 668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6
    • litellm-1.107.0-cp310-abi3-musllinux_1_2_x86_64.whl
      • SHA256: 1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00
    • litellm-1.107.0-cp310-abi3-musllinux_1_2_aarch64.whl
      • SHA256: c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054
    • litellm-1.107.0-cp310-abi3-win_amd64.whl
      • SHA256: 12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484
  • litellm/litellm:1.107.0 Image Docker (linux/amd64 et linux/arm64), y compris les récupérations via le dernière, dernières-actualités, et main-stable balises

Indicateurs de fichiers

  • cook.pth dans le répertoire « site-packages » de Python
    • SHA256: 7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb
  • cook.py dans le répertoire « site-packages » de Python
    • SHA256: 9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be25
  • sitecustomize.py dans le répertoire « site-packages » de Python
    • SHA256: 34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fa
  • /tmp/.pc_once_72129118c59f5636c0bb (fichier témoin laissé après l'exécution d'un programme de vol d'informations)
  • /tmp/remote_code_loader.lock (fichier de verrouillage détenu par le démon C2 pendant son exécution)

‍Indicateurs du réseau

  • http://www[.]litellm[.]dev/healthcheck (point d'extrémité d'exfiltration)
  • https://raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain[.]txt (Recherche de domaine C2)
  • Requête HTTP POST sortante avec User-Agent : Mozilla/4.0 (compatible ; MSIE 7.0 ; Windows NT 10.0 ; WOW64 ; Trident/7.0) et l'en-tête X-Token : XWiA8gZNa7NcX2XRoAEb
Partager :

https://www.aikido.dev/blog/litellm-compromised-infostealer-rat

Les vulnérabilités CVE critiques évoluent rapidement. Gardez une longueur d'avance.

Lancez votre analyse gratuite.
4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez vos systèmes dès aujourd'hui,
rapidement et gratuitement.

Sécurisez votre code, votre cloud et votre runtime au sein d'un système centralisé.
Connectez un dépôt pour découvrir ce que les agents de raisonnement trouvent dans votre base de code.

Aucune carte bancaire requise | Résultats de l'analyse en 32 secondes.
Utilisé par plus de 150 000 organisations