Criminosos publicaram uma versão maliciosa do LiteLLM no PyPI e conseguiram roubar credenciais de quem a instalou. A versão 1.107.0 foi enviada ao repositório na quarta-feira, 21 de outubro, às 11h39 UTC. O PyPI colocou o pacote em quarentena em poucas horas, e a imagem Docker correspondente saiu do Docker Hub e do GHCR logo depois. A versão segura mais recente é a 1.106.2.

O LiteLLM é uma biblioteca muito usada por equipes de desenvolvimento para falar com vários provedores de modelos de linguagem por uma única interface. Por isso, o ataque atinge justamente o tipo de ambiente que guarda chaves de API valiosas, credenciais de nuvem e acessos a sistemas internos.

COMO O PACOTE FOI COMPROMETIDO

Segundo a cobertura do caso, os invasores comprometeram o processo de publicação de versões do projeto. Eles usaram commits maliciosos em um repositório de nome parecido, com hífen no nome da organização BerriAI, e injetaram três arquivos no pipeline: cook.pth, cook.py e sitecustomize.py.

O truque está no arquivo com extensão pth. O Python lê esse tipo de arquivo ao iniciar e executa o código indicado, sem que o usuário precise importar a biblioteca ou rodar qualquer comando. Bastava instalar o pacote e abrir o interpretador para disparar o roubo.

O QUE O CÓDIGO ROUBAVA

O arquivo cook.py funciona como um ladrão de credenciais. Ele procura senhas e cookies de navegadores como Chrome, Firefox, Edge e Safari, credenciais da AWS, variáveis de ambiente e metadados de instâncias EC2 e ECS. Também busca chaves de contas de serviço do Google Cloud, tokens do Azure, chaves privadas SSH e GPG, históricos de shell e chaves de API de provedores como OpenAI, Anthropic e Cohere.

Os dados eram criptografados com AES-256-CBC, com a chave protegida por RSA-4096, e enviados por HTTP POST a um domínio controlado pelos atacantes. Já o sitecustomize.py instala um acesso remoto. Ele cria um processo em segundo plano que consulta a infraestrutura dos criminosos a cada hora em busca de comandos, o que permite novas ações depois do roubo inicial.

QUEM FOI AFETADO

Estão na lista de risco o pacote 1.107.0 do PyPI e a imagem litellm/litellm:1.107.0, inclusive para quem a puxou pelas tags latest, main-latest ou main-stable. A empresa informou que a distribuição empresarial privada não foi atingida. Segundo o balanço de incidentes da semana, a versão ficou disponível por cerca de duas horas.

Duas horas parecem pouco, mas em pipelines automatizados de integração contínua, uma instalação pode acontecer em segundos e sem ninguém olhando. Qualquer ambiente que tenha baixado a versão nesse intervalo deve ser tratado como comprometido.

COMO VERIFICAR E SE PROTEGER

Os pesquisadores indicam procurar por arquivos com o padrão /tmp/.pc_once_ , que sinalizam que a exfiltração já ocorreu, e pelo arquivo /tmp/remote_code_loader.lock, que indica que o processo de comando remoto rodou ou ainda está ativo. A recomendação geral é parar de implantar a versão 1.107.0 e voltar para a 1.106.2.

O passo mais importante é trocar todos os segredos que estavam acessíveis ao ambiente que executou o pacote. Isso inclui chaves de API, credenciais de nuvem, tokens de CI e chaves SSH. Também vale investigar qualquer máquina em que o Python tenha rodado depois da instalação, incluindo contêineres de proxy e runners de integração contínua.

O RECADO PARA QUEM USA PACOTES DE TERCEIROS

O caso reforça uma lição conhecida. Fixar versões com hash, evitar a tag latest em produção e atrasar a atualização de dependências por alguns dias reduz muito a exposição a ataques desse tipo. Equipes que trabalham com IA generativa merecem atenção extra, porque concentram chaves de vários provedores no mesmo lugar.

PERGUNTAS FREQUENTES

QUAL VERSÃO DO LITELLM ESTÁ COMPROMETIDA?

A versão 1.107.0, publicada no PyPI em 21 de outubro, e a imagem Docker litellm/litellm:1.107.0. A versão segura mais recente é a 1.106.2.

O QUE O CÓDIGO MALICIOSO FAZ?

Ele rouba credenciais de navegadores, nuvem, SSH e provedores de IA, envia os dados criptografados aos atacantes e instala um acesso remoto que consulta comandos a cada hora.

COMO SEI SE FUI ATINGIDO?

Procure arquivos /tmp/.pc_once_ e /tmp/remote_code_loader.lock nas máquinas em que o pacote foi instalado. A presença de qualquer um indica execução do código malicioso.

O QUE FAZER SE INSTALEI A VERSÃO 1.107.0?

Volte para a 1.106.2, troque todos os segredos acessíveis ao ambiente afetado e investigue qualquer sistema em que o Python tenha sido executado depois da instalação.

Notícia anteriorMicrosoft oferece demissão voluntária a cerca de 60 mil funcionários
Próxima notíciaItaú leva a ia.i, assistente de IA generativa, para 300 mil clientes