veilletech.fr
22 oct. Feed du jour
#03 SÉCURITÉ Faille

LiteLLM 1.107.0 piégé sur PyPI : voleur de secrets

Même sans importer litellm, le code tournait : renouvelez les secrets.

LiteLLM 1.107.0, publiée le 21 octobre sur PyPI et en images Docker, embarque un voleur d'identifiants et une porte dérobée qui s'exécutent au démarrage de tout processus Python. Le code est absent du dépôt public : l'attaquant a fait publier la version par le pipeline officiel. Désinstallez, cherchez les fichiers indicateurs et renouvelez tous les secrets de la machine.

4 min de lectureintermédiairevidéo 1:18
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Comment ça a atteint PyPI
  3. Ce que le paquet installe
  4. Indicateurs à chercher
  5. Comment s'y prendre
  6. À retenir

Ce qui se passe

Le 21 octobre 2026, la version LiteLLM 1.107.0 a été publiée sur PyPI avec un voleur d'identifiants et une porte dérobée à l'intérieur. Les sept wheels (Linux, macOS, Windows) sont touchées, ainsi que les images Docker v1.107.0, latest, main-latest et main-stable de Docker Hub (berriai/litellm) et de GHCR (ghcr.io/berriai/litellm). Le code malveillant n'existe pas dans le dépôt GitHub public. LiteLLM a confirmé la compromission dans un rapport d'incident ; l'analyse technique est de SafeDep.

Sont sains : 1.106.2, 1.107.0rc1, 1.107.0rc2, ainsi que litellm-proxy-extras==0.4.110 et litellm-enterprise==0.1.78, que la 1.107.0 épingle.

Comment ça a atteint PyPI

Selon LiteLLM, l'attaquant détenait les identifiants GitHub CLI de trois développeurs, probablement tirés des journaux d'un déploiement interne exposé à Internet. Avec le jeton d'un propriétaire d'organisation, il a contourné la protection de branche et pointé le workflow de publication, privé, vers un dépôt sosie, Berri-AI/litellm. Le pipeline officiel a ensuite tout fait lui-même.

Jetons de troisdéveloppeursProtection de branchecontournéeWorkflow pointé vers unfaux dépôtPipeline officiel publieWheels PyPI et imagesDockerInstallation du paquetChaque démarrage dePythonVol de secretsCode distant chaque heure
Du jeton volé aux secrets exfiltrés : le trajet de la version 1.107.0

La seule trace visible dans l'archive source est une ligne data = "cook" dans la section maturin de pyproject.toml ; le dossier cook/ lui-même n'y figure pas.

Horaires du 21 octobre (UTC) : 10:08 protection contournée · 11:39 à 11:40 sept wheels envoyées · 11:46 images Docker publiées · 13:23 version retirée de PyPI · 13:40 le compte GitHub letters9813 renvoie 404 · 14:20 tags Docker retirés ou repointés vers des images saines.

Ce que le paquet installe

Trois fichiers dans site-packages : cook.pth, cook.py et sitecustomize.py. Python exécute au démarrage les lignes import d'un fichier .pth et importe sitecustomize : le code tourne donc dans tout processus Python de la machine (application, pip, serveurs de langage d'éditeur, CI), même sans import litellm.

Le compte GitHub de l'attaquant a disparu, la porte dérobée ne trouve donc plus d'adresse. Mais les machines qui l'ont fait tourner avant ont pu exécuter une seconde charge : SafeDep n'a pas pu récupérer l'adresse du serveur.

Indicateurs à chercher

SHA-256 des sept wheels de litellm 1.107.0TEXT
462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7  manylinux_2_28_x86_64
668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6  manylinux_2_28_aarch64
1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00  musllinux_1_2_x86_64
c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054  musllinux_1_2_aarch64
7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d  macosx_10_12_x86_64
0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a  macosx_11_0_arm64
12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484  win_amd64

Comment s'y prendre

  1. Chercher litellm==1.107.0 dans les fichiers de verrouillage, les environnements virtuels, les images et les conteneurs en cours d'exécution.
  2. Chercher les fichiers indicateurs ci-dessus sur chaque machine concernée.
  3. Traiter une machine touchée comme compromise : désinstaller, puis renouveler tout ce qui s'y trouvait (clés SSH, jetons cloud et CI, clés des fournisseurs LLM, jetons d'outils d'IA).
  4. Reconstruire les images et les environnements ; rester sur 1.106.2 en attendant une version saine.

Source : SafeDep, 21 octobre 2026. Source en anglais. Complément : The Hacker News.