LiteLLM è una libreria e un server proxy Python open-source molto popolare che fornisce un'interfaccia unificata per chiamare oltre 100 API Large Language Model (LLM), come OpenAI, Anthropic, Bedrock e VertexAI, utilizzando il formato di input/output standard di OpenAI. Semplifica l'integrazione di più LLM, offrendo funzionalità come fallback automatici, tentativi e monitoraggio dei costi. Poiché funziona come un gateway API, agisce come un aggregatore di credenziali per design, detenendo in modo sicuro le chiavi API per i vari fornitori di LLM.
Panoramica
LiteLLM è ampiamente utilizzato da organizzazioni come Stripe, Netflix e Google ADK. Inoltre, gestisce oltre 95 milioni di download mensili ed è molto utilizzato come dipendenza transitiva nei principali framework di agenti AI, tra cui CrewAI, DSPy, Opik, Browser-Use, MLflow e OpenHands.
Un gruppo di attori pericolosi finanziariamente motivati noto come TeamPCP (rintracciato anche come DeadCatx3, PCPcat, ShellForce e CipherForce) ha eseguito un attacco alla catena di approvvigionamento del software critico sul pacchetto ufficiale `litellm` sul Python Package Index (PyPI). Il TeamPCP, che secondo quanto riferito collabora con il gruppo di estorsori LAPSUS$, ha preso di mira le credenziali di pubblicazione su PyPI dell'amministratore delegato e manutentore principale di LiteLLM, Krrish Dholakia.
Chi e cosa è stato colpito?
Gli aggressori hanno pubblicato due versioni dannose e retrodatate (1.82.7 e 1.82.8) direttamente su PyPI, aggirando completamente il processo di rilascio ufficiale CI/CD di GitHub:
- La versione 1.82.7 includeva un payload codificato in base64 in `litellm/proxy/proxy_server.py` che veniva eseguito in modo dannoso ogni volta che il modulo veniva importato.
- La versione 1.82.8 includeva un file altamente pericoloso `litellm_init.pth` posizionato nella radice della ruota. Le funzioni di configurazione del percorso nativo di Python elaborano automaticamente i file `.pth' all'avvio dell'interprete. Ciò significa che il malware viene eseguito in background ogni volta che viene avviato un processo Python, indipendentemente dal fatto che l'utente abbia importato esplicitamente LiteLLM.
Qualsiasi organizzazione, sviluppatore, pipeline CI/CD o processo di compilazione Docker che abbia eseguito `pip install litellm` (o lo abbia estratto come dipendenza transitiva non appuntata) il 24 marzo 2026, tra le 10:39 UTC e le 16:00 UTC circa, è interessato.
Chi non è interessato: Gli utenti dell'immagine Docker ufficiale di LiteLLM Proxy (`ghcr.io/berriai/litellm`) e di LiteLLM Cloud non sono stati compromessi, poiché le loro dipendenze sono state rigorosamente appuntate a versioni sicure.
Il malware ha scatenato un attacco devastante in tre fasi:
- Raccolta sistematica di credenziali: Ha setacciato i sistemi interessati e raccolto chiavi API di LLM, chiavi SSH, credenziali del cloud AWS/GCP/Azure, token dell'account del servizio Kubernetes, token di autenticazione del registro Docker, stringhe di connessione al database, credenziali Git, cronologie di shell, segreti CI/CD e portafogli di criptovalute.
- Esfiltrazione: I dati rubati sono stati raccolti in un archivio (`tpcp.tar.gz`), crittografati con uno schema ibrido AES-256 e RSA-4096 e inviati silenziosamente al sito `models.litellm[.]cloud` controllato dall'attaccante.
- Movimento laterale e persistenza: Sui cluster Kubernetes, ha utilizzato token di account di servizio accessibili per leggere tutti i segreti del cluster e distribuire un pod altamente privilegiato `alpine:latest` (`node-setup-*`) su ogni nodo. Ha quindi installato una backdoor di sistema persistente (`sysmon.py` e `sysmon.service`) che interroga periodicamente `checkmarx[.]zone/raw` per scaricare ed eseguire payload arbitrari di secondo livello dagli attaccanti.
Cronologia degli eventi
- Fine febbraio 2026: un bot AI autonomo chiamato "hackerbot-claw" ha sfruttato un flusso di richieste di pull mal configurato nel repository Trivy di Aqua Security, rubando un token GitHub privilegiato.
- 19 marzo 2026: TeamPCP ha utilizzato l'accesso residuo dalla violazione di Trivy per distribuire un binario Trivy che ruba le credenziali e avvelena le azioni GitHub. Poiché LiteLLM utilizzava Trivy nel proprio flusso di scansione di sicurezza CI/CD senza appuntare la versione, lo scanner Trivy compromesso ha raccolto silenziosamente il token `PYPI_PUBLISH` di LiteLLM.
- 20-23 marzo 2026: gli attori della minaccia hanno distribuito un worm autopropagante ("CanisterWorm") nell'ecosistema npm e hanno compromesso le azioni GitHub di Checkmarx KICS. Hanno inoltre registrato un dominio di esfiltrazione dannoso, `models.litellm[.]cloud`, per simulare l'infrastruttura LiteLLM legittima e un dominio C2 `checkmarx[.]zone`.
- 24 marzo 2026, 10:39 UTC: TeamPCP ha utilizzato il token PyPI rubato per pubblicare la versione 1.82.7 di `litellm` malevola su PyPI.
- 24 marzo 2026, 10:52 UTC: Gli aggressori hanno intensificato l'attacco pubblicando la versione 1.82.8, che ha aggiunto l'aggressivo vettore di esecuzione dei file `.pth`.
- 24 marzo 2026, 11:48 UTC: I ricercatori di FutureSearch hanno scoperto la compromissione dopo che il meccanismo di distribuzione `.pth` del malware ha accidentalmente creato una "bomba di fork" esponenziale che ha mandato in crash il loro sistema.
- 24 marzo 2026, 12:44 UTC: Gli aggressori hanno dispiegato una botnet per spammare il problema di divulgazione su GitHub e hanno usato account di manutentori compromessi per deturpare temporaneamente i repository e chiudere il problema come "non pianificato" per interrompere la risposta all'incidente.
- 24 marzo 2026, 13:38 UTC: Il team di sicurezza di PyPI ha messo in quarantena l'intero progetto `litellm`, bloccando ulteriori download.
- 24 marzo 2026, 15:27 UTC: Le versioni dannose sono state eliminate definitivamente, gli account dei manutentori sono stati recuperati e tutte le chiavi sono state ruotate con successo.
Misuredi mitigazione consigliate
Se si sospetta che il proprio sistema, la pipeline CI/CD o l'immagine Docker abbiano incontrato `litellm` 1.82.7 o 1.82.8, è necessario intraprendere immediatamente le seguenti azioni di rimedio:
- Identificare l'esposizione: Controllare tutti gli ambienti Python per verificare se le versioni 1.82.7 o 1.82.8 sono attualmente installate (`pip show litellm | grep Version`) e cercare esplicitamente la presenza del file `litellm_init.pth` in `site-packages`.
- Assumere una compromissione completa e ruotare i segreti: se è presente una delle due versioni, si deve assumere che tutte le credenziali, i token del cloud, le password del database, le chiavi LLM e le chiavi SSH accessibili all'ambiente siano state rubate. Ruotare immediatamente tutte le credenziali.
- Eliminare la persistenza: Arrestare e disabilitare l'unità di sistema `sysmon.service` ed eliminare `~/.config/sysmon/sysmon.py`, `/tmp/pglog` e `/tmp/.pg_state`. Negli ambienti Kubernetes, controllare accuratamente lo spazio dei nomi `kube-system` ed eliminare tutti i pod attaccanti che corrispondono a `node-setup-*`.
- Eliminare e ricostruire gli ambienti: Non fate un semplice downgrade del pacchetto. Cancellate e ricreate interamente gli ambienti virtuali di Python. Eliminare le cache del gestore di pacchetti locale (`pip cache purge` o `rm -rf ~/.cache/uv`) per evitare la reinstallazione accidentale di ruote dannose nella cache. Ricostruire gli ambienti CI interessati da immagini di base pulite.
- Appuntare le dipendenze: Assicurarsi che gli ambienti siano collegati all'ultima versione pulita conosciuta (`litellm==1.82.6` o precedente).
- Bloccare l'infrastruttura dannosa: Bloccare le connessioni di rete in uscita e la risoluzione DNS per i CIO noti nel perimetro di rete.
Indicatori di compromissione (CIO)
|
Categoria
|
Indicatore
|
Descrizione
|
|
Hash del file
|
8395c3268d5c5dbae1c7c6d4bb3c318c752ba4608cfcd90eb97ffb94a910eac2
|
1.82.7 ruota (SHA-256)
|
|
File Hash
|
d2a0d5f564628773b6af7b9c11f6b86531a875bd2d186d7081ab62748a800ebb
|
1.82.8 ruota (SHA-256)
|
|
File Hash
|
71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238
|
litellm_init.pth (SHA-256)
|
|
Hash del file
|
a0d229be8efcb2f9135e2ad55ba275b76ddcfeb55fa4370e0a522a5bdee0120b
|
Proxy_server.py dannoso (SHA-256)
|
|
Rete
|
models.litellm[.]cloud
|
Endpoint primario di esfiltrazione
|
|
Rete
|
checkmarx[.]zone
|
Endpoint C2 di persistenza
|
|
Rete
|
checkmarx[.]zone/raw
|
Endpoint di polling per la consegna del carico utile
|
|
Sistema di file
|
.../site-packages/litellm_init.pth
|
Carico utile all'avvio dell'interprete
|
|
Sistema di file
|
~/.config/sysmon/sysmon.py
|
Script backdoor persistente (anche in /root/)
|
|
Sistema di file
|
~/.config/systemd/user/sysmon.service
|
Unità dannosa ("System Telemetry Service")
|
|
Sistema di file
|
/tmp/pglog
|
Payload binario scaricato
|
|
Sistema di file
|
/tmp/.pg_state
|
File di tracciamento dello stato del malware
|
|
Sistema di file
|
tpcp.tar.gz
|
Archivio di esfiltrazione
|
|
Kubernetes
|
Pod: node-setup-*
|
Situato nello spazio dei nomi kube-system
|
|
Kubernetes
|
Immagine del contenitore: alpine:latest
|
Utilizzato all'interno del contenitore setup
|
Se siete preoccupati per una qualsiasi delle minacce descritte in questo bollettino o se avete bisogno di aiuto per determinare le misure da adottare per proteggervi dalle minacce più importanti per la vostra organizzazione, contattate il vostro account manager o, in alternativa, contattateciper scoprire come potete proteggere la vostra organizzazione.