Threat Advisories

Quando gli scanner di sicurezza diventano l'arma: un'analisi dell'attacco alla catena di approvvigionamento LiteLLM

Scritto da Integrity360 | 25-mar-2026 14.10.08

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.