Em 24 de março de 2026, o pacote Python LiteLLM, com mais de 95 milhões de downloads mensais, sofreu um comprometimento grave. As versões 1.82.7 e 1.82.8 disponibilizadas no PyPI continham um payload malicioso que exfiltrava chaves SSH, credenciais de provedores de nuvem, segredos Kubernetes, chaves de API, carteiras de criptomoedas e senhas de banco de dados para servidores controlados por atacantes.
O que aconteceu no incidente LiteLLM?
O grupo de ameaças TeamPCP obteve acesso às credenciais de publicação do mantenedor do LiteLLM no PyPI. Com isso, publicaram versões maliciosas diretamente no repositório PyPI, sem modificar o código-fonte no GitHub, que permaneceu limpo. Essa discrepância entre o código-fonte e o artefato distribuído foi o ponto crítico do ataque.

O malware explorava um arquivo .pth, um mecanismo pouco conhecido do Python que executa código automaticamente na inicialização do interpretador, mesmo sem importar explicitamente o pacote. Assim, apenas ter o LiteLLM instalado já permitia que o código malicioso coletasse credenciais, estabelecesse persistência via systemd e tentasse movimentação lateral em clusters Kubernetes.
Segundo Andrej Karpathy, a versão comprometida ficou disponível por menos de uma hora e foi descoberta devido a um bug no malware que causou a queda de uma máquina. Sem esse erro, o ataque poderia ter permanecido oculto por dias ou semanas.
Por que bibliotecas gateway de LLM são alvos críticos?
Bibliotecas gateway para LLMs (Large Language Models) armazenam as chaves de API para diversos provedores como OpenAI, Anthropic, Google, Azure e Cohere. Isso as torna alvos de alto valor, pois comprometê-las significa acesso a todos os serviços conectados na organização, ampliando o impacto do ataque.
5 Medidas Práticas para Reduzir Riscos na Cadeia de Dependências
A seguir, apresentamos práticas recomendadas baseadas no incidente LiteLLM para fortalecer sua segurança:
- Fixe versões exatas e verifique hashes
Evite especificadores de versão flexíveis em dependências críticas. Use versões exatas e verifique os hashes para garantir a integridade dos pacotes. Exemplo de comando:pip install --require-hashes -r requirements.txt
Seu arquivorequirements.txtdeve conter linhas como:litellm==1.82.6 --hash=sha256:<hash-conhecido>
Os hashes podem ser obtidos diretamente no PyPI em https://pypi.org/project/litellm/1.82.6/#files clicando em “view details” ao lado do arquivo wheel. - Audite arquivos .pth nos ambientes Python
Arquivos.pthpodem executar código na inicialização do interpretador, apesar de sua função original ser apenas incluir diretórios ao path. Para encontrar possíveis abusos, execute:find $(python -c "import site; print(site.getsitepackages()[0])") -name "*.pth" -exec grep -El "import|exec" {} \;
Qualquer arquivo que contenha comandosimportouexecpode representar risco de segurança ou impacto na performance. - Use o recurso de “trusted publishers” do PyPI para seus pacotes
Se você mantém pacotes Python, evite armazenar tokens de API ou senhas para publicação no PyPI. Utilize o mecanismo “trusted publishers” baseado em OIDC, que vincula a publicação a workflows específicos do GitHub Actions, eliminando o vetor de ataque via tokens comprometidos. Saiba mais em PyPI Trusted Publishers. - Compare artefatos distribuídos com o código-fonte
Nunca assuma que o pacote disponível no PyPI é idêntico ao código-fonte no GitHub. Para dependências críticas, baixe os pacotes e faça a comparação manual:pip download <pacote>==<versão> --no-deps -d /tmp/check
Em seguida, descompacte o arquivo wheel e compare com o código-fonte etiquetado para detectar divergências. - Utilize um espelho privado de pacotes com lista de permissões
Em ambientes de produção, configure um proxy ou espelho privado (como devpi ou Artifactory) que só forneça versões previamente auditadas, bloqueando versões comprometidas antes que cheguem à sua infraestrutura.
Como a Mozilla.ai protege suas dependências
No projeto any-llm, as publicações no PyPI são feitas exclusivamente através de workflows do GitHub Actions utilizando PyPI trusted publishers. Nenhum mantenedor possui token de API do PyPI armazenado localmente. A autenticação OIDC garante que mesmo uma conta de desenvolvedor comprometida não possa publicar versões maliciosas.
Facilidade para migrar do LiteLLM
Se você deseja se afastar do LiteLLM após o incidente, o any-llm é um substituto compatível com proxies OpenAI, com um guia de migração simples em 2 passos.
Seu gateway LLM é o ponto de maior exposição para credenciais sensíveis e deve ser tratado com o mesmo rigor de um banco de dados ou gerenciador de segredos. A lição do LiteLLM reforça a importância de auditar não só o código-fonte, mas também os pacotes distribuídos e os processos de publicação.
Links úteis
- Guia de Migração any-llm
- PyPI Trusted Publishers
- Repositório LiteLLM
- Workflow CI do any-llm
- Fonte original Mozilla AI
Frequently Asked Questions
Por que o código malicioso do LiteLLM foi executado mesmo sem que a biblioteca fosse importada no projeto?
O ataque explorou o mecanismo de arquivos .pth do Python. Embora criados para adicionar caminhos ao sistema, esses arquivos executam códigos automaticamente assim que o interpretador Python é iniciado. Por isso, a simples instalação do pacote comprometido bastou para ativar o malware.
Como posso descobrir se existem arquivos .pth maliciosos ou suspeitos no meu ambiente Python atual?
Você pode auditar seu ambiente rodando um comando de busca no terminal que localiza a pasta de pacotes do Python. O comando varre os arquivos com extensão .pth e filtra aqueles que contêm termos como 'import' ou 'exec', que indicam execução ativa de código.
Por que olhar apenas o histórico de commits no GitHub não garante que uma dependência seja segura?
No caso do LiteLLM, os atacantes invadiram as credenciais do PyPI e publicaram o pacote malicioso diretamente lá. O código-fonte no GitHub permaneceu limpo. Isso mostra que o artefato final distribuído pode ser diferente do código público auditado.
Como o recurso de 'trusted publishers' do PyPI ajuda a evitar incidentes como o do LiteLLM?
Esse recurso elimina a necessidade de usar e armazenar senhas ou tokens de API persistentes para publicar pacotes. Ele utiliza o protocolo OIDC para integrar a publicação diretamente a fluxos de trabalho confiáveis, como o GitHub Actions, reduzindo o risco de credenciais roubadas.
Qual é a vantagem de usar hashes de verificação no arquivo requirements.txt ao instalar pacotes?
Usar hashes garante que o instalador do Python (pip) baixe exatamente o mesmo arquivo verificado anteriormente. Se um invasor substituir uma versão legítima por uma maliciosa no PyPI mantendo o mesmo número de versão, a instalação falhará porque os hashes não serão compatíveis.
Descubra mais sobre noticiAI
Assine para receber nossas notícias mais recentes por e-mail.


