O ataque não exigiu uma vulnerabilidade de terceiros. Apenas puxar uma dependência contaminada e executar um build do Cargo foi suficiente para acionar uma carga útil remota, de acordo com o relatório original. Isso deslocou o risco da explorabilidade da aplicação para a estação de trabalho do desenvolvedor e o ambiente de integração contínua, onde segredos, chaves de assinatura e acesso à infraestrutura tendem a ficar.
Pesquisadores de segurança da SlowMist, Socket e StepSecurity identificaram releases maliciosos de arrayref@0.3.10, internment@0.8.7 e append-only-vec@0.1.9. Os pacotes contaminados introduziram uma dependência proc-macro1 com typosquatting. Durante builds do Cargo, o script de build da dependência baixou e executou uma carga útil remota antes mesmo de muitas equipes inspecionarem o código.
A equipe de segurança da Rust removeu as releases maliciosas e bloqueou a conta do mantenedor, apontando para um provável comprometimento da máquina do mantenedor ou das credenciais de publicação. Esse detalhe importa porque significa que a superfície de ataque não foi uma falha técnica isolada no código da crate. Foi uma violação em nível de conta dentro da própria cadeia de suprimentos do pacote.
Por que a exposição à Solana torna isso diferente
arrayref é amplamente usado em todo o ecossistema Rust, incluindo cadeias de dependências que tocam componentes adjacentes à Solana. A presença dessas crates em um grafo de projeto não significa que os projetos a jusante tenham sido comprometidos. Mas isso significa que muitas equipes tiveram que auditar rapidamente seus lockfiles e logs de build, já que uma versão maliciosa pode entrar em um projeto por dependências transitivas sem uma atualização direta.
A Solana tem consistentemente figurado entre os ecossistemas de desenvolvedores de blockchain mais ativos, e dados recentes sobre as principais blockchains por atividade de desenvolvimento mostram o tamanho dessa superfície de construção. Uma crate comprometida perto do fim de uma árvore de dependências pode ficar dentro de carteiras, validadores, indexadores e interfaces de DeFi sem qualquer alteração visível na aplicação a jusante.
A preocupação maior não é qual projeto específico enviou um binário malicioso. É o quanto da infraestrutura de criptomoedas depende de registries compartilhados de pacotes de código aberto. Um único comprometimento de conta de mantenedor pode se espalhar por grafos de build entre diferentes equipes e produtos. Para as equipes de segurança, a tarefa imediata é verificar os arquivos Cargo.lock das três versões maliciosas e inspecionar os runners de CI em busca de conexões de saída incomuns.
Um fator que complica a resposta é a lacuna entre a remoção de versões e a limpeza local. Um registry de pacotes pode remover uma release maliciosa rapidamente, mas isso não reescreve os arquivos Cargo.lock nas máquinas dos desenvolvedores nem reconstrói containers que já foram enviados. As equipes que constroem a partir de dependências em cache no CI podem não puxar a versão limpa, a menos que atualizem explicitamente o arquivo de lockfile. Esse atraso operacional dá aos atacantes uma janela para usar credenciais roubadas mesmo depois que o aviso público é divulgado.
Ataques em tempo de build atingem antes da revisão de código
Scripts de build ocupam uma posição perigosa porque executam no momento da compilação. Neste caso, a dependência typosquatted não era apenas um truque de nomenclatura. Ela usou a fase de build para buscar e executar uma carga útil remota, o que significa que o comportamento malicioso
