🔥 Pacote LiteLLM hackeado. Se você trabalha com APIs de LLM, é hora de se preocupar.

Ontem, no ecossistema Python, ocorreu um ataque exemplar à cadeia de suprimentos. O pacote litellm foi comprometido — uma biblioteca com 97 milhões de downloads por mês, que atualmente está sob o capô de muitos projetos de IA.

No PyPI, foi enviada a versão infectada 1.82.8. Nela, foi colocado cuidadosamente o arquivo litellm_init.pth com uma carga base64 que fazia uma coisa simples: vasculhava sua máquina em busca de qualquer segredo e os enviava para um servidor remoto, enquanto se autorreplicava.

A lista do que foi "roubado" incluiu tudo o que o script conseguiu alcançar:
▫️ Chaves SSH
▫️ Credenciais AWS/GCP/Azure
▫️ Configs do Kubernetes
▫️ Arquivos .env (olá, seus tokens da OpenAI)
▫️ Histórico do terminal e senhas de banco de dados
▫️ Chaves SSL privadas e carteiras de criptomoedas

Além disso, você nem precisava executar pip install litellm para entregar suas chaves de produção. Bastava instalar ou atualizar qualquer ferramenta que o puxasse como dependência transitiva. Por exemplo, atualizou o popular dspy (que tem litellm>=1.64.0 em seus requirements) — bem-vindo ao clube dos hackeados.

Mas há um detalhe incrível nessa história toda.

O que salvou a indústria de uma catástrofe global foi que o hacker era um programador ruim. 🤡
O malware foi escrito de forma tão ruim que causava vazamento de memória. Um cara usou um plugin no Cursor que, em segundo plano, puxou o litellm mais recente. O script consumiu toda a RAM e crashou o sistema. Graças a isso, a versão infectada ficou no PyPI por menos de uma hora até ser removida.

Se o invasor tivesse testado seu código adequadamente, o exploit poderia ter ficado ativo por semanas. Metade das startups de IA fecharia amanhã devido a bases de clientes vazadas e orçamentos esgotados na nuvem.

Andrej Karpathy comentou sobre isso com uma opinião: o paradigma clássico de desenvolvimento "construímos pirâmides com blocos de dependências" nas realidades modernas se torna uma vulnerabilidade fatal. Fomos ensinados por décadas ao padrão acadêmico: "não reinvente a roda, reutilize, pegue uma biblioteca pronta".
Na realidade moderna das cadeias de suprimentos, isso é como jogar roleta-russa. Cada vez que você adiciona uma nova dependência ao projeto, você está puxando toda a sua árvore até o décimo nível. E em algum lugar pode haver um mantenedor ofendido ou uma conta hackeada.

O paradigma está mudando. Em vez de puxar uma biblioteca enorme para algumas funções utilitárias, agora é mais seguro e pragmático simplesmente copiar e colar (ou gerar via LLM) o trecho de código necessário e travá-lo em seu repositório. 🤷‍♂️