Um grande ataque à cadeia de suprimentos direcionando o ecossistema Rust, no qual dois crates amplamente utilizados, arrayref e append-only-vec, foram sequestrados para entregar malware silenciosamente no momento em que os desenvolvedores compilavam seus projetos.
Escala do comprometimento
Juntos, os dois pacotes contam com centenas de milhões de downloads, tornando este um dos maiores compromissos de crates Rust já registrados por volume de download. Pesquisadores da Aikido Security primeiro notaram um novo pacote suspeito chamado proc-macro1 baixando silenciosamente e executando um arquivo remoto durante seu processo de compilação.
O nome era um typosquat deliberado de proc-macro2, um dos crates mais fortemente confiados no mundo Rust, e copiou a descrição e documentação do crate legítimo para parecer confiável. Na mesma hora, arrayref e append-only-vec, ambos mantidos pelo mesmo desenvolvedor, subitamente adicionaram proc-macro1 como dependência, transformando um typosquat isolado em um incidente completo de cadeia de suprimentos.
Mecanismo de ataque e execução
O comprometimento em si foi disfarçado em uma única linha injetada dentro do arquivo de manifesto de cada crate, apontando para proc-macro1 versão 1.0.107. Crucialmente, o código fonte visível de arrayref e append-only-vec permaneceu intacto e legítimo, então uma revisão de código manual não teria levantado alarmes.
O verdadeiro perigo estava escondido dentro do script build.rs do proc-macro1, um arquivo que o Cargo compila e executa automaticamente durante cada compilação, o que significa que os desenvolvedores nunca tiveram que chamar nenhuma função dos crates comprometidos para serem infectados. A técnica destaca como os atores de ameaça exploram configurações de compilação, ecoando riscos vistos em ferramentas de desenvolvimento comprometidas em ecossistemas de código aberto.
Uma vez acionado, o script de compilação baixou um binário específico da plataforma para Linux, Windows ou macOS de um servidor remoto identificado por um endereço IP nu, ofuscando o destino usando fragmentos codificados em base64 para evitar scanners baseados em strings.
Em sistemas Unix e macOS, o malware escreveu o payload em disco, marcou-o como executável e o lançou como um processo em segundo plano desanexado para que continuasse a ser executado mesmo após a compilação terminar, de acordo com o relatório da Aikido Security.
Capacidades do malware e persistência
A análise dos binários recuperados revelou um infostealer capaz de colher credenciais salvas de navegadores baseados em Chromium como Chrome, Brave e Edge, junto com dados do armazenamento de extensões do navegador, um local frequentemente usado por extensões de carteira de criptomoedas. Essa sobreposição funcional reflete capacidades encontradas em malware dedicado de roubo de credenciais projetado para enumeração rápida de host.
O malware também estabeleceu persistência no macOS por meio de uma configuração LaunchAgent configurada para relançar-se a cada login, e manteve contato com um servidor de comando e controle capaz de emitir comandos de shell remotos. O sigilo da operação decorreu do abuso da automação padrão de compilação de pacotes em vez de modificar a lógica de aplicação visível.
Resposta e mitigação
A Equipe de Resposta de Segurança Rust confirmou o script de compilação malicioso após receber uma dica de pesquisadores da Nextron Systems e moveu-se para excluir proc-macro1 junto com pacotes semelhantes relacionados incluindo proc-macro-en, aovine, arone, aronenao e tinymember.
A equipe também removeu as versões contaminadas, arrayref 0.3.10, append-only-vec 0.1.9 e internment 0.8.7, e bloqueou a conta do mantenedor comprometido como precaução, observando que o titular da conta parecia ser vítima de credenciais roubadas em vez de um insider malicioso.
As equipes que construíram projetos Rust durante a janela do incidente devem tratar seus pipelines de CI e caches de compilação local como potencialmente comprometidos e inspecionar o cache do registro Cargo para os arquivos de crate maliciosos. Fixar arrayref abaixo da versão 0.3.10, auditar logs de compilação recentes e habilitar autenticação de dois fatores em contas de publicação do crates.io são passos imediatos recomendados.
Manter um gerenciamento de patches rigoroso em todos os ambientes de compilação garante que os pipelines automatizados permaneçam defendidos contra dependências rogue. O incidente sublinha uma fraqueza persistente em ecossistemas de pacotes: scripts de tempo de compilação podem executar código arbitrário com privilégios de usuário completos muito antes que qualquer lógica de aplicação seja executada, tornando a verificação da confiança de dependência tão crítica quanto a revisão de código fonte.