- In zwei Versionen (1.82.7, 1.82.8) des weit verbreiteten LLM-Integrations-Frameworks LiteLLM wurden schädliche Payloads eingefügt und verteilt; bei der Installation kam es zu Angriffen, die System-Zugangsdaten exfiltrierten
- Ursache des Angriffs war eine Supply-Chain-Kompromittierung des CI/CD-Sicherheitsscanners Trivy, durch die CircleCI-Zugangsdaten offengelegt wurden und anschließend PyPI-Publishing-Token sowie GitHub-PATs entwendet wurden
- Nutzer des offiziellen LiteLLM Proxy Docker-Images waren nicht betroffen, da die Versionen in der
requirements.txt fest fixiert sind; Umgebungen mit direktem pip install aus PyPI sollten jedoch sofort überprüft werden
- Im GitHub-Issue-Thread tauchten Hunderte Bot-Spam-Kommentare auf, die die eigentliche Diskussion behinderten; bestätigt wurde, dass Angreifer damit die Reaktionskommunikation gezielt stören wollten
- Da viele Projekte wie DSPy, CrewAI LiteLLM als Abhängigkeit nutzen, zeigte der Vorfall erneut die grundsätzliche Verwundbarkeit der Software-Supply-Chain auf
Überblick über den Vorfall und seine Entdeckung
- Beim Einrichten eines neuen Projekts verhielt sich das System auffällig, RAM wurde aufgebraucht und Prozesse in Form einer Forkbomb wurden gestartet
- Die Untersuchung ergab, dass in
proxy_server.py ein base64-kodierter schädlicher Blob ergänzt worden war, der dekodiert, in eine separate Datei geschrieben und anschließend ausgeführt wurde
- Version 1.82.7 enthielt die Payload in
litellm/proxy/proxy_server.py und wurde bei import litellm.proxy ausgeführt
- Version 1.82.8 enthielt zusätzlich die Datei
litellm_init.pth, sodass bereits beim bloßen Installieren des Pakets beim Python-Start automatisch Schadcode ausgeführt wurde
.pth-Dateien nutzen einen Mechanismus, den Pythons site-Modul beim Start automatisch ausführt; hinter dem Schlüsselwort import kann beliebiger Code ausgeführt werden
- Dieser Mechanismus existiert seit Python 2.1 und wurde ohne separates PEP eingeführt
- Das Team von FutureSearch meldete den ersten Schaden: uvx installierte automatisch das neueste litellm (ohne Versions-Pinning), danach lud Cursor automatisch einen lokalen MCP-Server und löste so die Infektion aus
Angriffsweg und Zusammenhang mit TeamPCP
- Der Angriff wurde denselben Akteuren zugeschrieben wie der jüngsten Kompromittierung von Trivy, der Gruppe TeamPCP
- Verlauf der Kompromittierung: Trivy-Hack → vollständiger Abfluss der CircleCI-Zugangsdaten → Diebstahl von PyPI-Publishing-Token + GitHub-PAT → Verteilung der schädlichen Pakete
- Auch die GitHub-Konten von LiteLLM-CEO und -CTO wurden vollständig übernommen; Beschreibungen privater Repositories wurden auf „teampcp owns BerriAI“ geändert und Issues geschlossen
- Das Token
PYPI_PUBLISH war als Umgebungsvariable im GitHub-Projekt gespeichert und wurde über Trivy offengelegt
- Für das Konto war 2FA aktiviert, wurde aber durch den Diebstahl des Tokens selbst umgangen
- Die Angreifer posteten in GitHub-Issues mit Hunderten Bot-Konten wiederholt identische Formulierungen und behinderten damit die echte Diskussion
- Im Trivy-Repository wurde dasselbe Muster mit mehr als 700 Spam-Kommentaren beobachtet
- Einige der Spam-Konten gehörten realen GitHub-Nutzern mit echter Beitrags-Historie; seit Februar wurden dort Commits mit „Update workflow configuration“ gefunden, die Credential-Stealer in CI-Workflows einschleusten
- Die Trivy-Kompromittierung lag mindestens 5 Tage zurück; da die aktuelle Angriffsmitteilung erst am Vortag veröffentlicht wurde, konnten Maintainer betroffen sein, ohne den Vorfall bereits erkannt zu haben
- Zur Auslieferung der Payload nutzten die Angreifer auch Internet Computer Protocol (ICP) Canisters, wodurch eine reine DNS-Blockade als Schutz nicht ausreicht
Funktionsweise der schädlichen Payload
- Sie erzeugte einen Python-Prozess im Hintergrund, dekodierte eingebettete Stufen und führte sie aus
- Ein Credential-Collector lief an; bei erfolgreicher Datensammlung wurde der AES-Schlüssel mit dem RSA-Public-Key des Angreifers verschlüsselt und die exfiltrierten Daten an einen Remote-Host übertragen
- In der Schadsoftware gefundene URLs:
checkmarx.zone/raw und models.litellm.cloud
- Vorrangige Ziele waren vor allem SSH-Schlüssel in
~/.git-credentials sowie Informationen zu Krypto-Wallets
- Durch CPU-intensive Aktivitäten wurde das System überlastet, was die Entdeckung eher erleichterte; in manchen Fällen fiel die Anomalie durch laute Lüfter auf
- Auch bei Harbor-Installationen traten dieselben Symptome auf: Prozesse wie
grep -r rpcuser\rpcpassword liefen als Forkbomb und versuchten, Krypto-Wallets aufzuspüren
Reaktion des LiteLLM-Teams
- Die betroffenen Versionen (v1.82.7, v1.82.8) wurden aus PyPI entfernt
- Passwörter aller Maintainer-Konten wurden geändert, sämtliche Schlüssel für GitHub/Docker/CircleCI/pip gelöscht und ersetzt
- Neue Maintainer-Konten wurden auf @krrish-berri-2 und @ishaan-berri umgestellt
- Das gesamte Paket wurde auf PyPI vorübergehend unter Quarantäne gestellt und nach Entfernung der infizierten Versionen wieder freigegeben
- Alle neuen Releases wurden gestoppt, die Verteilung bleibt eingefroren, bis eine vollständige Review der Supply Chain abgeschlossen ist
- Die Untersuchung und Wiederherstellung laufen in Zusammenarbeit mit Googles Mandiant-Security-Team
- Trivy wurde auf die letzte sichere Version v0.35.0 festgesetzt (nach anfänglichem Pinning auf v0.69.3 auf Basis von Community-Feedback geändert)
- Künftig werden Sicherheitsmaßnahmen wie Trusted Publishing (JWT-tokenbasiertes OIDC) und getrennte PyPI-Konten geprüft
- Der erste Veröffentlichungszeitpunkt der schädlichen Versionen lag ungefähr bei UTC 8:30, die Quarantäne auf PyPI erfolgte gegen UTC 11:25
Ausmaß der Auswirkungen und Downstream-Projekte
- LiteLLM ist die einzige Bibliothek für Aufrufe an LLM-Provider in DSPy, und CrewAI nutzt sie ebenfalls als Fallback
- Auch Airflow, Dagster, Unsloth.ai, Polar, nanobot und weitere hängen von LiteLLM ab
- Laut GitHub-Suche enthalten mehr als 628 Projekte LiteLLM in der
requirements.txt ohne Versions-Pinning
- Nutzer des offiziellen Proxy-Docker-Distributionswegs waren nicht betroffen, da die
requirements.txt fest gepinnte Versionen enthält
- Bei Docker-Deployments ist der Zugriff auf Host-Dateisystem und Umgebungsvariablen eingeschränkt und damit relativ sicherer; gemountete Zugangsdaten bleiben jedoch riskant
- Hauptziel der Angreifer waren private SSH-Schlüssel; der Zugriff auf LLM-Keys war eher zweitrangig
- Auch Nutzer von Tools wie Harbor oder browser-use, die LiteLLM automatisch als Abhängigkeit installieren, meldeten indirekte Schäden
- CrewAI pinnte
litellm auf 1.82.6 (letzte sichere Version), erwähnte den Vorfall im Commit-Text jedoch nicht
- DSPy reagiert mit einem öffentlich angelegten Issue
- LangChain besitzt eine eigene Schicht für Aufrufe an LLM-Provider und ist daher nicht direkt von dieser Supply-Chain-Kompromittierung betroffen (außer bei Nutzung des optionalen Pakets
langchain-litellm)
Community-Diskussion: Supply-Chain-Sicherheit und Sandboxing
- Abhängigkeiten und Entwicklungsumgebungen seien nicht länger vertrauenswürdig; nötig sei Defense in Depth mit VM-Isolation + Container-Primitiven + Allowlists + Egress-Filtern +
seccomp + gVisor
- Nach 50 Jahren bequemlichkeitsorientierter Sicherheitsentscheidungen sei nun eine grundlegende Neugestaltung des gesamten Sicherheitsmodells nötig
- Teilweise wurde gefordert, Sandboxing auf Programmiersprachen-Ebene pro Modul bereitzustellen
- Java hatte diese Funktion seit den 1990ern ab v1.2, sie wurde jedoch wegen Problemen bei der Nutzbarkeit später abgeschafft
- Manche sehen nun den richtigen Zeitpunkt für Capability-basierte Sprachen
- Als bestehende Lösung mit Modul-Isolation wurde Cloudflares Laufzeit workerd genannt
- Auf Betriebssystem-Ebene existieren bereits Isolationswerkzeuge wie OpenBSDs pledge/unveil, Linux-Mechanismen wie chroot/namespace/cgroup sowie FreeBSDs Capsicum
- Guix kann in wenigen Sekunden isolierte Container erzeugen und Abhängigkeiten installieren, ohne auf
$HOME zuzugreifen
- Werkzeuge zur Isolation im User-Space wie Firejail und bwrap sollten aktiver eingesetzt werden
- Das Modell aus Sandboxing + Berechtigungen (Intents) ist von mobilen Apps bereits bekannt, während es auf dem Desktop starke Vorbehalte gegen allgemeine Rechenbeschränkungen gibt
- Dagegen wurde eingewandt, dass die Abgeschlossenheit von App Stores bei Apple/Meta und Sicherheits-Sandboxing zwei verschiedene Themen sind und sich Werkzeuge bauen lassen, die Nutzerkontrolle und Sicherheit zugleich ermöglichen
- Für macOS wurde ein Canary/Honeypot-Tool veröffentlicht (
github.com/dweinstein/canary): Es mountet gefälschte Secrets per WebDAV/NFS, um anomale Zugriffe zu erkennen
- Manche argumentierten, zwischen Paketveröffentlichung und öffentlichem Repository müsse eine Mauer eingezogen werden; ein öffentliches Repository direkt als Trusted Publisher zu verwenden, vergrößere die Angriffsfläche
- Die Gegenposition lautet, Trusted Publishing diene gerade dazu, eine auditierbare Verbindung zwischen Quellcode und veröffentlichtem Artefakt herzustellen; der Umweg über private Repositories wäre daher ein Rückschritt
Praktische Sicherheitsempfehlungen
- Abhängigkeiten müssen mit SHA256-Prüfsummen und fest gepinnten Versionen verwaltet werden
- Der Betrieb interner Paket-Mirror soll verhindern, dass direkt die jeweils neuesten Versionen genutzt werden
- Statt spontaner Installationen bei der Auslieferung mit
uv run und ähnlichen Methoden sollten Build-Artefakte verwendet werden
- Dadurch entfällt auch das strukturelle Risiko, dass Systeme bei einer PyPI-Störung stehen bleiben
- Vorteile auslieferbarer Artefakte: Auditierbarkeit, schnelles Rollback und die Möglichkeit, riskante Endpunkte für ausgehenden Netzwerkverkehr zu blockieren
- Mit der Einstellung
exclude-newer in uv lassen sich neu erschienene Pakete für einen bestimmten Zeitraum ausschließen
- In der
pyproject.toml ist etwa [tool.uv] exclude-newer = "5 days" möglich
- In CI/CD sollte für Publishing-Token ein OIDC-basierter Workflow eingeführt werden, um Token selbst ganz zu eliminieren
- Sowohl GitHub als auch PyPI unterstützen OIDC: Wenn nur der Publishing-Job Zugriff auf den OIDC-Endpunkt erhält, gibt es im Trivy-Job kein stehlbares Token mehr
- Sicherheitsscanner wie Trivy sollten auf separaten Workern ohne Publishing-Rechte laufen
- Lockfile-Pflege und Updates im Wochenrhythmus helfen, die sofortige Übernahme der neuesten Versionen zu vermeiden
- Python-
.pth-Dateien erlauben automatische Codeausführung; mit der Option -S lässt sich der site-Import unterdrücken, was jedoch Kompatibilitätsprobleme verursachen kann
- Es wird empfohlen, mit Tools wie osv-scanner die gesamte Projekt-Abhängigkeitskette zu überprüfen
- Befehle zur Prüfung auf eine Infektion:
find / -name "litellm_init.pth" -type f 2>/dev/null
find / -path '*/litellm-1.82.*.dist-info/METADATA' -exec grep -l 'Version: 1.82.[78]' {} \; 2>/dev/null
- Zudem wurde die Notwendigkeit einer flächendeckenden Rotation von Zugangsdaten im gesamten Paketmanager-Ökosystem angesprochen
SOC2-Audit und Vertrauensfrage
- Es wurde darauf hingewiesen, dass LiteLLMs SOC2-Auditor die zuletzt umstrittene Firma Delve war
- SOC2 prüft nur, ob dokumentierte Prozesse tatsächlich befolgt werden, garantiert aber nicht das Sicherheitsniveau selbst
- Selbst ein angemessenes SOC2 hätte diesen Supply-Chain-Angriff möglicherweise nicht verhindern können
Alternative Projekte zu LiteLLM
- Bifrost (github.com/maximhq/bifrost): Rust-basierte Alternative, auch in kostenlosen Open-Source-Instanzen mit konfigurierbaren virtuellen Schlüsseln
- Portkey (portkey.ai): Proxy-Service mit kostenlosem Tarif, laut Einschätzungen schneller als LiteLLM
- pydantic-ai: Python-basierte Alternative
- any-llm (github.com/mozilla-ai/any-llm): Projekt von Mozilla
- LLM Gateway (llmgateway.io): bietet einen LiteLLM-Migrationsleitfaden
- InferXgate (github.com/jasmedia/InferXgate): neues Projekt mit begrenzter Unterstützung für Provider
- Manche Entwickler vertreten die Ansicht, dass es bei LLM-Provider-APIs faktisch nur OpenAI und Anthropic gebe und direkte Aufrufe per
requests.post() sicherer seien
- Dem wird entgegengehalten, dass Anthropics OpenAI-kompatible API nicht als langfristige/produktive Lösung empfohlen wird und native APIs je Anbieter eigene Funktionen besitzen, die sich nicht auf die OpenAI-API abbilden lassen
1 Kommentare
Hacker-News-Kommentare
Ich bin der Maintainer von LiteLLM. Die aktuelle Lage wird noch untersucht, aber bisher wissen wir Folgendes
requirements.txtfest angeheftet warWir prüfen derzeit die Ursachenanalyse und Maßnahmen zur Härtung der Sicherheit; es tut mir leid, dass dies Unannehmlichkeiten verursacht hat
.venv-, uv- und Systemumgebungen schnell scannen könnenWir können Abhängigkeiten und Entwicklungsumgebungen weiterhin nicht vertrauen. Dev Container bieten zu wenig Isolation und sind zudem unkomfortabel. Wir müssen jetzt zu sandbox-basierten Entwicklungsumgebungen wechseln. Es braucht Umgebungen mit Isolation auf VM-Ebene, Egress-Filtern und Verteidigungsschichten wie seccomp und gVisor. In so einer Umgebung würde bei einer Kompromittierung der Container sofort beendet und das Problem ließe sich leichter identifizieren
Es wird ein für macOS entwickeltes Canary-Tool vorgestellt (Link). Es handelt sich um ein einfaches Go-Binary, das Dateien erkennt, auf die ein Paket nicht zugreifen sollte. Über WebDAV oder NFS werden falsche Geheimnisse exponiert; bei einem Zugriff wird eine Benachrichtigung gesendet. Mit diesem Honeypot-Ansatz lassen sich auffällige Aktivitäten erkennen
Das steht im Zusammenhang mit den TeamPCP-Aktivitäten der letzten Wochen. Die von mir zusammengestellte Zeitleiste dürfte hilfreich sein
Es wurde kritisiert, dass GitHubs Spam-Erkennungssystem viel zu schwach sei. Im litellm-Issue seien über 170 Spam-Kommentare gepostet worden
Dass so etwas irgendwann passieren würde, war zu erwarten. Man versuchte, sich durch fest angeheftete Abhängigkeitsversionen zu schützen, aber auch das ist nicht perfekt. Wegen der Komplexität der Open-Source-Supply-Chain ist es unmöglich, allen Code zu verifizieren. Durch LLMs ist das Risiko einer massenhaften Verbreitung von Schadcode wohl um das Hundertfache gestiegen
Wenn KI-generierter Code LLVM oder Linux infiltriert, stehen wir wirklich vor dem Problem des „trusting trust“
curl | bashaus. Der XZ-Backdoor-Vorfall war ein Beispiel, das an diese Realität erinnert hatEs wurde erwähnt, dass LiteLLMs SOC2-Prüfstelle Delve war.
Nach der Installation von Harbor schnellte die CPU auf 100 %, und das System fror ein. Ein Prozess mit
grep -r rpcuser\rpcpasswordschien nach Krypto-Wallets zu suchen. Immerhin wurde keine Backdoor installiertDieser Vorfall scheint vom selben Angreifergruppierung auszugehen wie der TeamPCP-Hack von Trivy. Dass das Issue mit Bot-Kommentaren überflutet wird, ist dasselbe Muster. Sehr wahrscheinlich handelt es sich um einen automatisierten Angriff unter Einsatz von LLMs