A segurança de memória garantida pelo verificador de empréstimos (borrow checker) do compilador rustc protege aplicações em produção contra corrupção de pilha e uso após liberação (use-after-free). Contudo, durante a fase de compilação, o gerenciador de pacotes Cargo concede execução arbitrária de código nativo na máquina do desenvolvedor ou no servidor de integração contínua por meio de scripts build.rs e macros procedurais (proc-macro).
Anatomia da Execução em Tempo de Compilação no Cargo
Sempre que um engenheiro executa cargo build, cargo check ou cargo test — ou mesmo quando o analisador sintático rust-analyzer indexa um espaço de trabalho no editor — o Cargo compila e executa qualquer arquivo build.rs presente nas dependências transitivas antes mesmo de compilar uma única linha do código-fonte principal do projeto.
| Vetor de Ataque no Ecossistema Cargo | Momento de Disparo | Artefato Binário Gerado no Host | Técnica de Detecção Forense |
|---|---|---|---|
build.rs (Script de Compilação) | cargo check / cargo build / rust-analyzer | target/debug/build/<crate>-<hash>/build-script-build | Inspeção de tabela de importação ELF/PE e rastreamento strace / ebpf |
proc-macro (Macro Procedural) | Expansão de AST pelo processo rustc | Biblioteca compartilhada .so / .dll / .dylib carregada na memória do compilador | Engenharia reversa via Ghidra e auditoria de chamadas de rede em proc_macro::TokenStream |
| Typosquatting e Confusão de Dependências | Resolução da árvore Cargo.lock | Payloads estáticos ocultos em constantes de bytes ou include_bytes! | Diferenciação entre o tarball publicado no crates.io e a tag do repositório Git |
Engenharia Reversa de Binários build-script-build
Em investigações de resposta a incidentes conduzidas pelo laboratório forense da DigitalSpying, observamos que pacotes maliciosos raramente deixam strings em texto claro no código Rust publicado no crates.io. Em vez disso, os invasores utilizam ofuscação baseada em operações XOR ou decodificação em múltiplas etapas dentro do binário build-script-build para exfiltrar variáveis de ambiente críticas como AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN e chaves SSH locais.
Assinaturas na Tabela de Símbolos e Chamadas de Sistema
Um script build.rs legítimo limita-se a emitir diretivas cargo:rustc-link-lib ou compilar código C/C++ estático via crate cc. Quando a análise estática no Ghidra ou Rizin revela referências a APIs de sockets (connect, getaddrinfo, WSAStartup), enumeração de diretórios fora de OUT_DIR ou invocação de interpretadores de comando (/bin/sh, powershell.exe), o binário deve ser imediatamente isolado como comprometido.
static.crates.io e o repositório público usando cargo vet, fixe hashes criptográficos no Cargo.lock e isole a compilação de dependências externas em namespaces de rede restritos sem acesso às credenciais do host.