← Todos os Posts

O Fork Bomb Nos Salvou

O malware no LiteLLM 1.82.8 continha um arquivo .pth que era executado em qualquer inicialização do Python. Ele coletava chaves SSH, credenciais de nuvem, carteiras de criptomoedas e segredos de CI/CD, criptografava tudo com uma chave RSA de 4096 bits e exfiltrava o arquivo para um domínio controlado pelo atacante. O payload era bem projetado. A criptografia era sólida. A exfiltração era limpa.1 Este incidente faz parte da minha série sobre segurança de agentes, que aborda as falhas do mundo real que moldam como construímos confiança em sistemas automatizados.

O arquivo .pth também gerava um processo filho Python para executar seu trabalho. Esse processo filho acionava o arquivo .pth novamente. Que gerava outro processo filho. Que o acionava de novo. Um fork bomb exponencial que consumia 100% da CPU e mais de 5 GB de RAM em segundos.2

O fork bomb era um bug. O atacante não pretendia que o malware fosse visível. Uma versão implementada corretamente teria rodado silenciosamente em cada invocação do Python em cada sistema infectado, potencialmente por semanas. Em vez disso, os desenvolvedores notaram suas máquinas travando, investigaram e encontraram o ladrão de credenciais. O PyPI colocou ambas as versões em quarentena 46 minutos após a publicação.1

Quarenta e seis mil instalações em quarenta e seis minutos. O mecanismo de detecção foi um erro de implementação no malware.

TL;DR

  • O bug: O ladrão de credenciais do LiteLLM 1.82.8 tinha um bug de fork bomb que fazia as máquinas infectadas travarem. Sem o bug, o ladrão teria rodado silenciosamente por semanas.
  • A lacuna: Análise estática, monitoramento comportamental e revisão de código — todos falharam em detectar o ataque. Cada camada de detecção presumia que outra camada pegaria o problema. Nenhuma pegou.3
  • A curva: A qualidade do atacante melhora com a iteração. A técnica do .pth agora está documentada publicamente. O próximo atacante a herda sem o bug.
  • O que funciona sem sorte: Verificação de idade de domínio em requisições de saída, baseline comportamental para instalações de pacotes, canários no sistema de arquivos, isolamento de instalação. Cada um funciona independentemente da qualidade do payload.
  • A assimetria: O defensor escolhe o ambiente. Se o ambiente de instalação não tem credenciais para roubar, um payload perfeito não colhe nada.

Tivemos Sorte

Remova o fork bomb do payload e o ataque tem sucesso silenciosamente. O arquivo .pth é executado antes de qualquer import, antes de qualquer código da aplicação, antes de qualquer sandbox em nível de Python. Não há ponto de interceptação. Não há entrada de log. O ladrão de credenciais executa, criptografa, exfiltra, e o processo Python continua normalmente. O desenvolvedor não vê nada. O pipeline de CI não vê nada. O scanner de segurança não vê nada, porque o scanner de segurança era o vetor de ataque em primeiro lugar.3

A história de detecção do LiteLLM 1.82.8 não é “nosso monitoramento pegou.” A história de detecção é “o atacante publicou um bug.”

Essa não é uma base confortável para segurança de cadeia de suprimentos. Como argumento em your agent sandbox is a suggestion, as fronteiras que presumimos existir entre código confiável e não confiável são muito mais porosas do que a maioria das equipes imagina.

A Curva de Qualidade do Atacante

A qualidade de software melhora com a iteração. Isso vale tanto para atacantes quanto para defensores. A campanha do TeamPCP atingiu cinco ecossistemas em uma semana: GitHub Actions, Docker Hub, npm, Open VSX e PyPI.4 Cada comprometimento de ecossistema usou credenciais colhidas do anterior. A campanha demonstrou sofisticação operacional: registro de domínio 24 horas antes da entrega do payload, sequestro de tags em referências mutáveis e evasão de rotação de credenciais por meio de alterações incompletas de chaves pela Aqua Security.

O fork bomb foi o único erro em uma operação competente no restante. A próxima campanha não cometerá esse erro. A técnica do arquivo .pth agora está documentada publicamente, analisada pela CrowdStrike, Microsoft, Wiz e Palo Alto.3 O próximo atacante herda a técnica sem o bug.

A capacidade adversarial segue a mesma curva de melhoria que a capacidade defensiva. A técnica é pública. A análise é pública. O próximo atacante começa onde o TeamPCP parou. Exploro o que essa curva significa para sistemas autônomos em what actually breaks unsupervised.

A Detecção Não Pode Depender de Erros do Atacante

O modelo atual de detecção de cadeia de suprimentos tem três camadas, e todas as três falharam para o LiteLLM:

A análise estática falhou. O arquivo .pth é um recurso legítimo do Python. O payload estava duplamente codificado em base64 e era decodificado em tempo de execução. Scanners estáticos que procuram padrões maliciosos conhecidos não encontram nada porque o padrão é novo.

O monitoramento comportamental falhou. O ladrão de credenciais fez um único POST HTTPS de saída para um domínio que parecia um serviço legítimo (models.litellm.cloud). O monitoramento de saída que inspeciona domínios de destino precisaria saber que esse domínio específico foi registrado 24 horas antes. A maioria dos monitores de saída não verifica a idade do domínio.

A revisão de código falhou. As versões maliciosas foram publicadas diretamente no PyPI, contornando completamente o pipeline de CI/CD do GitHub. Não houve pull request para revisar. Não houve diff para inspecionar. O atacante usou credenciais de publicação roubadas para fazer upload de pacotes pré-compilados.

Cada camada de detecção presumia que uma parte diferente da cadeia de ataque pegaria o problema. Nenhuma pegou. O fork bomb pegou o problema.

O Que Realmente Detecta Malware Silencioso

Se você não pode contar com erros do atacante, precisa de mecanismos de detecção que funcionem independentemente da qualidade da implementação.

Verificação de idade de domínio em requisições de saída. O domínio de exfiltração foi registrado 24 horas antes do ataque. Uma regra de firewall que sinaliza requisições de saída para domínios com menos de 7 dias de registro teria pego isso. A regra é simples, a taxa de falsos positivos é gerenciável e ela captura o padrão de exfiltração mais comum.

Baseline comportamental para processos Python. Um pip install que de repente faz requisições HTTPS POST para um domínio desconhecido é anômalo. Monitoramento comportamental em nível de processo que rastreia atividade de rede durante a instalação de pacotes sinalizaria isso.

Canários no sistema de arquivos. Coloque uma chave SSH falsa em um caminho canário e uma credencial AWS falsa em outro caminho canário. Monitore qualquer processo que leia esses arquivos. Um ladrão de credenciais que varre caminhos padrão vai ler os canários. Um processo legítimo não vai. O canário dispara um alerta antes que a exfiltração seja concluída.

Isolamento de instalação. Execute pip install em um ambiente sem acesso a credenciais reais. Copie os pacotes instalados para o ambiente de produção depois. O arquivo .pth é disparado durante o próprio processo Python do pip, o que significa que o ladrão de credenciais executa durante a instalação. Se o ambiente de instalação não tem credenciais para roubar, o ataque não colhe nada.

Nenhum desses mecanismos exige que o atacante cometa um erro. Eles funcionam independentemente da qualidade do payload. O padrão arquitetural — projetar ambientes onde mesmo um ataque perfeito não colhe nada — é o mesmo princípio por trás de deploy and defend: the agent trust paradox.

A Assimetria

A defesa tem uma vantagem estrutural: o defensor escolhe o ambiente. O atacante precisa trabalhar dentro de qualquer ambiente onde o pacote é instalado. Se esse ambiente não tem credenciais, não tem acesso à rede e possui canários no sistema de arquivos, o payload tem sucesso técnico mas falha operacionalmente.

O ataque ao LiteLLM funcionou porque o ambiente de instalação era o mesmo que continha credenciais de publicação, chaves SSH e tokens de nuvem. O fork bomb foi irrelevante para a arquitetura de segurança. Foi relevante para a linha do tempo.

Da próxima vez, o fork bomb não estará lá. As credenciais ainda estarão no mesmo ambiente que o gerenciador de pacotes. A questão é se você terá mudado o ambiente antes que o próximo atacante publique um payload limpo. Minha análise da arquitetura do agente Ralph mostra como estruturar sistemas de agentes para que componentes comprometidos não consigam escalar além de sua fronteira de isolamento.


FAQ

Por que o atacante não testou o fork bomb?

O arquivo .pth gerando um processo filho é uma escolha de implementação razoável para executar um payload sem bloquear o processo pai. O gatilho recursivo é uma interação sutil entre o .pth e a inicialização do site.py do Python. É o tipo de bug que aparece em testes de integração mas não em testes unitários, e autores de malware têm oportunidade limitada de fazer testes de integração em ambientes realistas.

O fork bomb poderia ter sido intencional?

Improvável. O fork bomb tornou o malware imediatamente visível, que é o oposto do objetivo do atacante. Um ladrão de credenciais silencioso que roda por semanas colhe ordens de magnitude mais credenciais do que um que é detectado em 46 minutos.

A verificação de idade de domínio é prática em escala?

Sim. A idade do domínio está disponível via WHOIS ou APIs de data de registro DNS. A verificação adiciona milissegundos de latência por requisição. A maioria das organizações pode colocar domínios novos conhecidos em uma lista de permissões.


Fontes


  1. FutureSearch (Daniel Hnyk), “LiteLLM Hack: Were You One of the 47,000?” Março de 2026. 

  2. isfinne et al., “LiteLLM Supply Chain Attack,” GitHub Issue #24512, Março de 2026. 

  3. Blake Crosley, “The Supply Chain Is the Attack Surface,” blakecrosley.com, Março de 2026. 

  4. Kaspersky, “Trojanization of Trivy, Checkmarx, and LiteLLM Solutions,” Março de 2026. 

  5. Blake Crosley, “When Your Agent Becomes the Researcher,” blakecrosley.com, Março de 2026. 

Artigos relacionados

Seu agente tem um intermediário que você não verificou

Pesquisadores testaram 28 routers de API LLM. 17 tocaram em credenciais canário da AWS. Um drenou ETH de uma chave priva…

13 min de leitura

A Cadeia de Suprimentos É a Superfície de Ataque

O Trivy foi comprometido. Depois o LiteLLM. Depois 47.000 instalações em 46 minutos. A cadeia de suprimentos de IA funci…

19 min de leitura

O Ralph Loop: Como Executo Agentes de IA Autônomos Durante a Noite

Construí um sistema de agentes autônomos com stop hooks, orçamentos de spawn e memória em sistema de arquivos. Aqui estã…

7 min de leitura