Comprometimento da cadeia de suprimentos do LiteLLM 1.107.0: roubo de credenciais via hooks de inicialização do Python
Um ator mal-intencionado usou credenciais de desenvolvedor roubadas para desviar o pipeline de release do LiteLLM — gateway amplamente usado para rotear chamadas a múltiplos provedores de LLM — e publicar a versão 1.107.0 com um stealer de credenciais embutido. O malware explora o mecanismo de inicialização do Python (arquivos .pth e sitecustomize.py) para executar automaticamente sem que o pacote precise ser importado, coletando chaves de API, credenciais de nuvem, tokens Git e segredos de CI/CD.
O ataque começou com o roubo de credenciais de pelo menos dois desenvolvedores envolvidos no pipeline de release do LiteLLM: uma delas foi usada para redirecionar o fluxo de publicação para um repositório com nome quase idêntico ao oficial (Berri-AI/litellm em vez de BerriAI/litellm), e outra, de um segundo desenvolvedor, satisfez a etapa de aprovação de produção necessária para que o pacote malicioso saísse publicado como release legítimo. Esse tipo de desvio no próprio processo de CI/CD, em vez de uma falha de código no produto, é o que caracteriza o incidente como um comprometimento de cadeia de suprimentos.
Tecnicamente, o pacote instalou três arquivos fora da árvore normal da aplicação: um arquivo .pth contendo uma linha executável (import cook), um módulo cook.py que carrega e decodifica um coletor de credenciais apelidado de PRIVCOLLECT, e um sitecustomize.py — mecanismo padrão do próprio Python para executar código automaticamente na inicialização do interpretador. Como o Python processa arquivos .pth e sitecustomize.py durante a fase de inicialização do site, o código malicioso roda mesmo sem que ninguém importe o LiteLLM ativamente, o que o torna difícil de notar em auditorias superficiais de dependências.
O coletor PRIVCOLLECT teve como alvo um leque amplo de segredos: chaves de API de provedores de modelos de IA, credenciais AWS/Azure/Google Cloud, tokens do GitHub, dados salvos em navegadores, chaves SSH e GPG, segredos de pipelines de CI/CD e variáveis de ambiente de processos em execução — além de ler, com limite de 500 linhas, campos selecionados de tabelas do banco de dados usado pelo proxy do LiteLLM. Havia também um mecanismo de carregamento remoto de código: o sitecustomize.py adquiria um lock exclusivo, lia um arquivo no GitHub funcionando como "dead drop" para descobrir um domínio de comando, solicitava um endpoint remoto (/codepy) e compilava/executava o conteúdo retornado como código Python — um backdoor rearmável, mesmo que a execução remota efetiva não tenha sido confirmada em todos os casos.
Isso importa na prática porque o LiteLLM funciona como gateway/proxy para chamadas a múltiplos provedores de LLM em pipelines de produção de IA, concentrando justamente o tipo de segredo mais valioso para um atacante: chaves de API de modelos, credenciais de nuvem e tokens que permitem movimento lateral para outros sistemas. Comprometer essa camada de infraestrutura de IA dá a um atacante acesso simultâneo a múltiplos provedores e ambientes, muito além do que um único serviço comprometido normalmente exporia.
A Microsoft publicou assinaturas de detecção (Trojan:PyPI/Stealer.SA e Backdoor:PyPI/LiteLlmSupplyChain.C) e recomenda isolar imediatamente ambientes afetados, parar de executar Python neles até confirmar a remoção dos arquivos cook.pth, cook.py e sitecustomize.py maliciosos, reconstruir a partir de uma base limpa, rotacionar todas as credenciais potencialmente expostas e reforçar controles de proveniência de dependências (lock files com hash fixado) e egress de rede.