A primeira dependência nova em dez anos

A 20 de agosto de 2026, um atacante que tinha comprometido uma conta de mantenedor no crates.io, o registo oficial de pacotes Rust, usou esse acesso para publicar versões envenenadas de três crates muito usados: arrayref, internment e append-only-vec. O arrayref, sozinho, está presente em mais de 35 por cento de todos os ambientes Rust e em cerca de três em cada quatro ambientes onde o Rust aparece, o que o torna uma das bibliotecas pequenas mais omnipresentes de todo o ecossistema, apesar de passar quase despercebido.

A versão maliciosa arrayref 0.3.10 trazia um pormenor que, por si só, já deveria ter sido um sinal de alarme: era a primeira dependência nova que o arrayref tinha adicionado em toda a sua história de dez anos. Um crate que passou uma década inteira a lançar atualizações sem dependências e que, de repente, ganha uma, é exatamente o tipo de alteração que uma revisão cuidadosa de dependências deveria assinalar, caso alguém estivesse mesmo a fazer essa revisão.

Um script de build foi executado antes de qualquer código

Cada versão envenenada acrescentava uma dependência a um novo crate chamado proc-macro1, também ele malicioso. O proc-macro1 continha um script de build, um pequeno programa que o Cargo, a ferramenta de build do Rust, executa automaticamente como parte da compilação de um projeto, antes mesmo de o próprio código do projeto terminar de ser construído ou de ser executado.

Foi precisamente essa execução automática que tornou o ataque tão discreto: um programador ou um pipeline de CI não precisava de executar o binário final, clicar em nada nem importar uma função suspeita para ficar comprometido. Bastava executar cargo build num projeto que dependesse do crate envenenado para acionar o script de build e descarregar a carga útil do atacante.

Retirar e empurrar: um truque emprestado do npm

O atacante também retirou as versões antigas e limpas do arrayref, da 0.3.5 à 0.3.9, do registo. Retirar uma versão não a elimina por completo, mas faz com que o Cargo mostre o aviso habitual de que um projeto deveria considerar atualizar para uma versão que não esteja retirada.

Com todas as versões limpas marcadas como retiradas, a única versão não retirada que restava ao Cargo para recomendar era a maliciosa 0.3.10, o que empurrava os programadores para a versão envenenada através das próprias ferramentas do registo. Os investigadores de segurança já tinham identificado este mesmo padrão de retirar e empurrar em ataques anteriores à cadeia de fornecimento do npm, pelo que o seu aparecimento no crates.io sugere o mesmo guião de engenharia social através de ferramentas, e não uma invenção nova.

Três crates, três janelas curtas

As três versões maliciosas foram publicadas dentro de uma janela de 22 minutos na manhã de 20 de agosto de 2026, e as três foram removidas entre cerca de 90 a 107 minutos depois de entrarem em funcionamento, assim que a Rust Security Response Team bloqueou a conta comprometida e retirou os pacotes.

CrateVersão maliciosaPublicado (UTC)Removido (UTC)Minutos ativo
arrayref0.3.1007:1508:4186
internment0.8.707:3409:0490
append-only-vec0.1.907:3709:25107

Uma janela de menos de duas horas parece curta, mas o crates.io não tem qualquer atraso incorporado entre a publicação de uma nova versão e o momento em que qualquer projeto dependente a pode obter automaticamente na compilação seguinte, pelo que mesmo uma janela curta é suficiente para que um script de build alcance qualquer projeto que seja recompilado nesse período.

Roubo de credenciais, um kill switch e uma ligação à Coreia do Norte

A Wiz Research analisou a carga útil e encontrou uma backdoor que comunica com um servidor remoto através de HTTPS, enumera as credenciais guardadas no Chrome, no Brave e no Edge, instala persistência multiplataforma e consegue executar quatro comandos remotos distintos, incluindo um kill switch e um comando para executar scripts arbitrários.

A Wiz descobriu também que o ponto de contacto da backdoor partilha infraestrutura com a campanha Mastra, que a Microsoft atribuiu ao Sapphire Sleet, um grupo ligado à Coreia do Norte, e com um ataque anterior ao pacote npm axios que a Google Cloud Threat Intelligence e a Mandiant, separadamente, também associaram à Coreia do Norte, sugerindo que o mesmo tipo de agente que já tinha comprometido o npm demonstrou agora a mesma capacidade contra o crates.io. A descoberta é atribuída à Nextron Systems GmbH, uma empresa alemã de segurança; a Rust Security Response Team bloqueou a conta e retirou as três versões, e até agora não surgiu qualquer prova confirmada de exploração real.

O Rust resolve erros de memória, não quem controla a conta

O Cyber Resilience Act da UE e a NIS2 têm vindo, há algum tempo, a empurrar os fabricantes de produtos críticos para a segurança e produtos conectados para linguagens seguras em memória, e o Rust tem sido um dos principais beneficiários dessa pressão. Este incidente é um lembrete de que migrar para Rust por motivos de conformidade resolve um problema, os erros de segurança de memória como os buffer overflows, sem tocar num outro, completamente distinto: quem controla a conta que publica as dependências de um projeto, e o que um script de build tem permissão para executar antes de o próprio código do projeto sequer terminar de compilar.

Os proprietários que ordenaram uma migração para Rust por motivos de conformidade deveriam colocar três perguntas concretas às suas equipas de engenharia: se as atualizações de dependências são revistas antes de serem integradas, se o pipeline de CI consegue isolar ou restringir o que um script de build tem permissão para fazer, e se alguém repararia sequer numa retirada e nova publicação no mesmo dia de um pacote em que a equipa confia há anos. Vale a pena notar que a própria descoberta veio da Nextron Systems GmbH, uma empresa alemã, o que desmente qualquer suposição de que este risco na cadeia de fornecimento é apenas problema dos outros.