Il supply chain attack di LiteLLM ha inserito uno stealer e una backdoor
Il supply chain attack di LiteLLM ha compromesso la versione 1.107.0 del pacchetto Python, inserendo codice malevolo in software distribuito attraverso un canale di sviluppo consolidato. Le analisi di SafeDep, Socket, StepSecurity e Upwind hanno individuato un credential stealer, che cerca dati di autenticazione, insieme a una backdoor in grado di eseguire codice Python fornito dall'attaccante. La release interessata è stata distribuita sotto forma di pacchetti wheel tramite Python Package Index (PyPI) e di Docker image. Un wheel è un file installabile contenente un pacchetto Python, mentre una Docker image è un ambiente preconfezionato usato per eseguire un'applicazione in un container.
PyPI ha messo in quarantena il pacchetto compromesso e le Docker image malevole sono state rimosse. LiteLLM ha dichiarato che l'indagine è ancora in corso e di non aver stabilito in che modo l'attaccante abbia inizialmente ottenuto la possibilità di pubblicare la release. L'organizzazione ha inoltre rimosso i collegamenti attendibili tra la propria organizzazione GitHub e i registry pubblici, per impedire che tali connessioni venissero usate per pubblicare altri pacchetti.
Secondo LiteLLM, le azioni malevole hanno coinvolto gli account GitHub di tre ingegneri e sembravano basarsi su OAuth token rubati dell'interfaccia a riga di comando di GitHub. Un OAuth token è una credenziale digitale che consente a un'applicazione o a uno strumento di agire tramite un account senza richiederne ripetutamente la password. L'attaccante ha usato un account per avviare il workflow di rilascio del progetto, chiamato project-releaser, e un altro account per approvarlo. LiteLLM ha revocato ogni token noto come coinvolto. Tuttavia, non ha determinato come siano stati ottenuti i token e ha dichiarato di non poter ancora escludere ulteriori accessi agli account interessati. Come misura temporanea, ha rimosso dalla propria organizzazione GitHub tutti gli utenti tranne un account non interessato.
I file interessati sono litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl, litellm-1.107.0-cp310-abi3-macosx_11_0_arm64.whl, litellm-1.107.0-cp310-abi3-manylinux_2_28_aarch64.whl, litellm-1.107.0-cp310-abi3-manylinux_2_28_x86_64.whl, litellm-1.107.0-cp310-abi3-musllinux_1_2_aarch64.whl, litellm-1.107.0-cp310-abi3-musllinux_1_2_x86_64.whl e litellm-1.107.0-cp310-abi3-win_amd64.whl. L'archivio litellm-1.107.0.tar.gz non conteneva i file del payload, ma il suo file di configurazione pyproject.toml era stato modificato.
StepSecurity ha identificato due componenti malevoli. Il primo, che si presenta con il nome privcollect, raccoglie credenziali e altre informazioni sensibili. Il secondo crea un daemon in background, cioè un programma che continua a funzionare senza una finestra aperta, e controlla ogni ora una posizione su GitHub. Se in quella posizione è disponibile codice Python controllato dall'attaccante, il daemon lo esegue. Ciò conferisce alla compromissione capacità che vanno oltre un singolo furto di dati, perché un sistema infetto potrebbe successivamente ricevere ed eseguire ulteriori istruzioni.
Il malware si avvia prima che un utente importi LiteLLM in un programma. Ci riesce tramite cook.pth, un file di path Python che l'interprete elabora automaticamente durante l'avvio. Il file contiene un'istruzione per importare un module denominato cook, che avvia il raccoglitore di credenziali. Un comportamento simile durante l'avvio era stato osservato nella precedente compromissione di LiteLLM associata ai supply chain attack di TeamPCP a marzo.
Il raccoglitore cerca dati di accesso ai servizi cloud, credenziali degli account degli sviluppatori, private keys, file di autenticazione usati dagli strumenti per lo sviluppo dell'intelligenza artificiale, dati dei browser Chromium e Firefox ed environment variables, cioè impostazioni di sistema che le applicazioni usano spesso per conservare configurazioni o segreti. Può inoltre esaminare i deployment di LiteLLM alla ricerca di credenziali salvate dal proxy e della configurazione dei modelli. Il materiale rubato viene inserito in un archivio TAR compresso con GZIP e inviato tramite una richiesta web HTTP POST a litellm[.]dev/healthcheck.
La backdoor legge inoltre domain.txt dal repository GitHub github[.]com/letters9813. Se il file contiene un dominio, il malware esegue nuovamente lo stealer, richiede contenuti dal path /codepy del dominio ed esegue la risposta. Attualmente il repository restituisce un errore 404, indicando che la posizione richiesta non è disponibile, ma i sistemi che hanno già eseguito il pacchetto compromesso richiedono comunque interventi di bonifica.
Agli utenti che hanno scaricato LiteLLM 1.107.0 viene consigliato di revocare e sostituire le credenziali potenzialmente esposte da un ambiente pulito, ossia da un sistema separato sul quale non è stata eseguita la release malevola. La raccomandazione è di usare la versione 1.106.2 e fissarla tramite digest, un'impronta digitale invariabile che garantisce l'installazione del pacchetto o della Docker image previsti. Poiché lo stealer prendeva di mira account cloud, browser, private keys, strumenti di sviluppo e dati del proxy LiteLLM, la bonifica dovrebbe riguardare tutte le credenziali presenti sul computer interessato, non soltanto un account LiteLLM.
Per le aziende che devono affrontare questo tipo di rischio legato allo sviluppo e all'hosting, AEU-I offre servizi IT, infrastrutture e consulenza incentrati anzitutto sulla sicurezza. La rimozione del pacchetto e delle Docker image limita i nuovi download, ma non elimina il malware dai sistemi sui quali era già stata installata la versione 1.107.0 e non sostituisce le informazioni che potrebbero essere state raccolte.