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. 🤷♂️
Comentários
0Ainda não há comentários.
Entre para participar da conversa.