- Duas versões (1.82.7, 1.82.8) do pacote PyPI da amplamente usada biblioteca de integração de LLM LiteLLM foram distribuídas com payload malicioso inserido, e a instalação desencadeava um ataque para roubar credenciais do sistema
- A causa do ataque teve origem em um comprometimento da cadeia de suprimentos do Trivy, ferramenta de varredura de segurança de CI/CD, o que levou ao vazamento de credenciais do CircleCI e ao roubo do token de publicação no PyPI e de um GitHub PAT
- Usuários da imagem oficial Proxy Docker do LiteLLM não foram afetados porque o
requirements.txt fixa a versão, mas ambientes que executaram pip install diretamente a partir do PyPI precisam de verificação imediata
- Centenas de comentários de spam de bots inundaram a thread da issue no GitHub e atrapalharam a discussão real, o que foi confirmado como uma tentativa deliberada do atacante de confundir a comunicação de resposta
- O impacto também se propagou para muitos projetos que usam LiteLLM como dependência, como DSPy e CrewAI, destacando mais uma vez a fragilidade fundamental da segurança da cadeia de suprimentos de software
Visão geral do incidente e como foi descoberto
- Durante a configuração de um novo projeto, o sistema começou a se comportar de forma anormal, com esgotamento de RAM e execução de processos em formato de fork bomb
- A investigação mostrou que um blob malicioso codificado em base64 havia sido adicionado a
proxy_server.py; ele era decodificado, gravado em um arquivo separado e então executado
- A versão 1.82.7 incluía o payload em
litellm/proxy/proxy_server.py, sendo executado ao fazer import litellm.proxy
- A versão 1.82.8 incluía adicionalmente o arquivo
litellm_init.pth, de modo que apenas instalar o pacote já fazia com que o malware fosse executado automaticamente na inicialização do Python
- Arquivos
.pth são um mecanismo executado automaticamente pelo módulo site do Python na inicialização e podem executar código arbitrário após a palavra-chave import
- Esse mecanismo existe desde o Python 2.1 e foi introduzido sem um PEP separado
- A equipe da FutureSearch relatou a primeira infecção: o uvx instalou automaticamente a versão mais recente do litellm (sem fixação de versão), e então o Cursor carregou automaticamente um servidor MCP local, causando a infecção
Caminho do ataque e ligação com o TeamPCP
- Foi confirmado que o ataque foi realizado pelo mesmo grupo TeamPCP responsável pelo comprometimento recente do Trivy
- Caminho da invasão: hack do Trivy → vazamento completo das credenciais do CircleCI → roubo do token de publicação no PyPI + GitHub PAT → distribuição do pacote malicioso
- A conta GitHub do CEO/CTO do LiteLLM também foi totalmente comprometida, com as descrições dos repositórios pessoais alteradas para "teampcp owns BerriAI" e issues sendo fechadas, entre outras ações
- O token
PYPI_PUBLISH estava armazenado como variável de ambiente no projeto GitHub, e foi exposto por meio do Trivy
- A conta tinha 2FA ativado, mas isso foi contornado porque o próprio token foi roubado
- O atacante publicou repetidamente a mesma frase em issues do GitHub usando centenas de contas de bots, dificultando a discussão real
- O mesmo padrão foi visto no repositório do Trivy, com mais de 700 comentários de spam
- Algumas das contas de spam pertenciam a usuários reais do GitHub com histórico de contribuição; foi confirmado que, desde fevereiro, haviam feito commits como "Update workflow configuration" para inserir um coletor de credenciais no workflow de CI
- O comprometimento do Trivy ocorreu há pelo menos 5 dias, e como o aviso de ataque mais recente só saiu no dia anterior, é possível que os mantenedores tenham sido afetados sem perceber
- O atacante também usou Internet Computer Protocol (ICP) Canisters para entregar payloads, tornando insuficiente a defesa baseada apenas em bloqueio por DNS
Como o payload malicioso funciona
- Cria um processo Python em segundo plano e decodifica/executa estágios embutidos
- Um coletor de credenciais é executado e, quando a coleta tem sucesso, a chave AES é criptografada com a chave pública RSA do atacante, e os dados roubados são enviados para um host remoto
- URLs encontradas no malware:
checkmarx.zone/raw e models.litellm.cloud
- O alvo principal eram chaves SSH em
~/.git-credentials e informações de carteiras cripto
- Como a carga realizava tarefas intensivas de CPU, o sistema ficava sobrecarregado, o que acabou facilitando a detecção; houve até relatos de descoberta pelo barulho das ventoinhas
- O mesmo sintoma apareceu durante a instalação do Harbor: um processo
grep -r rpcuser\rpcpassword era executado em forma de fork bomb na tentativa de procurar carteiras cripto
Resposta da equipe do LiteLLM
- As versões afetadas (v1.82.7, v1.82.8) já foram removidas do PyPI
- Senhas alteradas para todas as contas de mantenedores, e todas as chaves do GitHub/Docker/CircleCI/pip foram revogadas e substituídas
- As novas contas de mantenedor passaram a ser @krrish-berri-2 e @ishaan-berri
- O pacote inteiro foi temporariamente colocado em quarentena no PyPI e depois liberado após a remoção das versões infectadas
- Todos os novos releases foram suspensos, com o envio congelado até a conclusão de uma revisão completa da cadeia de suprimentos
- A equipe está trabalhando com o time de segurança Mandiant, do Google, na investigação e recuperação
- O Trivy foi fixado na última versão segura, v0.35.0 (mudando da fixação inicial em v0.69.3 após feedback da comunidade)
- Também estão sendo avaliadas melhorias de segurança, como migração para Trusted Publishing (OIDC com token JWT) e uso de uma conta separada no PyPI
- O primeiro horário de publicação da versão maliciosa foi por volta de UTC 8:30, e a quarentena no PyPI ocorreu por volta de UTC 11:25
Escopo do impacto e projetos downstream
- O LiteLLM é a única biblioteca de chamada de provedor LLM usada pelo DSPy, e o CrewAI também o utiliza como fallback
- Airflow, Dagster, Unsloth.ai, Polar, nanobot e outros também dependem de LiteLLM
- Segundo busca no GitHub, há mais de 628 projetos com LiteLLM no
requirements.txt sem fixação de versão
- Usuários que utilizam o caminho oficial de distribuição do Proxy Docker não foram impactados, pois o
requirements.txt já está com a versão fixada
- No caso de deploys com Docker, o acesso ao sistema de arquivos do host e a variáveis de ambiente é mais restrito, o que oferece alguma proteção; ainda assim, credenciais montadas continuam em risco
- O principal alvo do atacante eram chaves SSH pessoais; o acesso a chaves de LLM era secundário
- Usuários de ferramentas como Harbor e browser-use, que instalam LiteLLM automaticamente como dependência, também relataram impacto indireto
- O CrewAI fixou o
litellm em 1.82.6 (última versão segura), mas a mensagem de commit não mencionava o comprometimento
- O DSPy está reagindo publicamente por meio de uma issue
- O LangChain possui sua própria camada de chamadas a provedores LLM e, por isso, não foi afetado diretamente por este comprometimento da cadeia de suprimentos (exceto no uso opcional do pacote
langchain-litellm)
Discussão da comunidade: segurança da cadeia de suprimentos e sandboxing
- Dependências e ambientes de desenvolvimento não podem mais ser confiados cegamente, e são necessárias defesas em múltiplas camadas (defense in depth) como isolamento por VM + primitivas de contêiner + allowlist + filtro de egress + seccomp + gVisor
- Há a percepção de que 50 anos de conveniência em detrimento da segurança estão cobrando seu preço, e que é preciso redesenhar o modelo de segurança como um todo
- Houve opiniões defendendo sandboxing no nível da linguagem de programação, por módulo
- O Java já tinha esse recurso desde a v1.2 nos anos 1990, mas ele foi abandonado por problemas de usabilidade
- Alguns argumentam que este é o momento ideal para linguagens baseadas em capabilities
- O runtime workerd, da Cloudflare, foi citado como solução existente capaz de isolar módulos
- Ferramentas de isolamento em nível de sistema operacional como pledge/unveil do OpenBSD, chroot/namespace/cgroup no Linux e Capsicum no FreeBSD já existem
- O Guix pode criar contêineres isolados em segundos, permitindo instalar dependências sem acessar
$HOME
- Foi defendido o uso mais ativo de ferramentas de isolamento em espaço de usuário como Firejail e bwrap
- O modelo de sandboxing + permissões (Intents) dos apps móveis já existe, mas em desktops há forte resistência a limitar computação geral
- Em resposta, foi argumentado que o fechamento de app stores de Apple/Meta e o sandboxing de segurança são questões separadas, e que é possível criar ferramentas que preservem o controle do usuário sem abrir mão da segurança
- Foi compartilhada uma ferramenta de canary/honeypot para macOS (github.com/dweinstein/canary): ela monta segredos falsos em WebDAV/NFS para detectar acessos anômalos
- Também houve quem defendesse a criação de uma barreira entre publicação de pacotes e repositórios públicos: ao configurar um repositório público diretamente como Trusted Publisher, a superfície de ataque aumenta
- Como contraponto, argumentou-se que o objetivo original do Trusted Publishing é fornecer uma ligação auditável entre o código-fonte e o artefato publicado, e que passar por repositórios privados seria um retrocesso
Recomendações práticas de segurança
- Dependências devem ter versão fixada com checksum SHA256 obrigatoriamente
- Operar um espelho interno de pacotes para evitar o uso direto das versões mais recentes
- Usar artefatos de build e evitar depender de instalação em tempo real no deploy com
uv run e similares
- Isso também elimina o risco estrutural de o sistema parar em caso de indisponibilidade do PyPI
- Vantagens dos artefatos implantáveis: auditabilidade, rollback rápido e possibilidade de bloquear endpoints de rede de saída arriscados
- A configuração
exclude-newer do uv permite excluir pacotes novos dentro de um certo período
- É possível definir
[tool.uv] exclude-newer = "5 days" no pyproject.toml
- Em CI/CD, a solução fundamental é migrar tokens de publicação para workflows baseados em OIDC, eliminando o token em si
- GitHub e PyPI suportam OIDC: se só o job de publicação tiver acesso ao endpoint OIDC, o job do Trivy não terá token para roubar
- Ferramentas de varredura de segurança como o Trivy devem rodar em workers separados sem permissão de publicação
- Recomenda-se manter lockfiles e fazer atualizações semanais, evitando adotar imediatamente a versão mais recente
- Arquivos
.pth no Python permitem execução automática de código; é possível inibir a importação de site com a opção -S, embora isso possa causar incompatibilidades
- Também é recomendável fazer varredura de todas as dependências do projeto com ferramentas como osv-scanner
- Comandos para verificar infecção:
find / -name "litellm_init.pth" -type f 2>/dev/null
find / -path '*/litellm-1.82.*.dist-info/METADATA' -exec grep -l 'Version: 1.82.[78]' {} \; 2>/dev/null
- Também foi levantada a necessidade de rotação em massa de credenciais em todo o ecossistema de gerenciadores de pacotes
Auditoria SOC2 e questões de confiabilidade
- Foi apontado que a empresa responsável pela auditoria SOC2 do LiteLLM era a Delve, que esteve recentemente envolvida em controvérsia
- SOC2 apenas verifica se processos documentados estão realmente sendo seguidos, e não garante o nível real de segurança
- Mesmo uma auditoria SOC2 bem-feita talvez não tivesse prevenido este ataque à cadeia de suprimentos
Projetos alternativos ao LiteLLM
- Bifrost (github.com/maximhq/bifrost): alternativa em Rust, com configuração de chaves virtuais até mesmo em instâncias open source gratuitas
- Portkey (portkey.ai): serviço de proxy, com plano gratuito, avaliado por alguns como mais rápido que o LiteLLM
- pydantic-ai: alternativa baseada em Python
- any-llm (github.com/mozilla-ai/any-llm): projeto da Mozilla
- LLM Gateway (llmgateway.io): oferece um guia de migração a partir do LiteLLM
- InferXgate (github.com/jasmedia/InferXgate): projeto novo, com suporte mais limitado a provedores
- Alguns desenvolvedores argumentam que, na prática, as APIs de provedores de LLM se resumem a OpenAI e Anthropic, então chamar diretamente via
requests.post() seria mais seguro
- Em contraponto, a API compatível com OpenAI da Anthropic não é recomendada como solução de longo prazo/produção, e as APIs nativas de cada fornecedor têm recursos próprios que não se mapeiam à API da OpenAI
1 comentários
Comentários do Hacker News
Sou o maintainer do LiteLLM. A situação ainda está sob investigação, mas o que foi apurado até agora é o seguinte
No momento estamos revisando a análise de causa raiz e as medidas para reforçar a segurança, e peço desculpas pelo transtorno
Ainda não podemos confiar em dependências e ambientes de desenvolvimento. Dev containers têm isolamento insuficiente e também deixam a desejar em usabilidade. Agora precisamos migrar para ambientes de desenvolvimento baseados em sandbox. É necessário um ambiente com isolamento em nível de VM, filtro de egress e camadas de defesa como seccomp e gVisor. Em um ambiente assim, mesmo que haja comprometimento, o contêiner seria encerrado imediatamente e o problema poderia ser identificado com facilidade
Foi apresentado um canary para macOS (link). É um binário simples em Go que detecta arquivos aos quais um pacote não deveria ter acesso. Ele expõe segredos falsos via WebDAV ou NFS e envia alertas quando há acesso. Dá para detectar comportamento anômalo com essa abordagem de honeypot
Isso está relacionado às atividades recentes do TeamPCP nas últimas semanas. A linha do tempo que organizei talvez seja útil
Houve críticas de que o sistema de detecção de spam do GitHub é fraco demais. Disseram que a issue do litellm recebeu mais de 170 comentários de spam
Eu já esperava que algo assim fosse acontecer um dia. Tentei me defender com fixação de versões de dependências, mas nem isso é perfeito. Por causa da complexidade da cadeia de suprimentos no open source, é impossível verificar todo o código. Com LLMs, o risco de espalhar malware em grande escala aumentou 100 vezes
Se código escrito por IA se infiltrar no LLVM ou no Linux, vamos realmente encarar o problema de “trusting trust”
curl | bashsem pensar duas vezes. O caso do backdoor no XZ foi um exemplo que expôs essa realidadeFoi mencionado que a empresa de auditoria SOC2 do LiteLLM era a Delve.
Depois de instalar o Harbor, o uso de CPU subiu para 100% e o sistema travou. O processo
grep -r rpcuser\rpcpasswordaparentemente tentou procurar carteiras de criptomoedas. Felizmente, nenhum backdoor foi instaladoEste caso parece ser obra do mesmo grupo atacante, o TeamPCP que hackeou o Trivy. O padrão de encher a issue com comentários de bot também é o mesmo. É bem provável que tenham usado ataques automatizados com LLM