A JFrog Security Research divulgou em 3 de junho a descoberta do IronWorm, um worm de supply-chain escrito em Rust que comprometeu 37 pacotes npm, infectou 57 commits em 9 organizações ligadas ao ecossistema Arweave e combina rootkit eBPF de kernel, comando e controle por Tor e auto-replicação via OIDC do npm. O malware é descrito pelos pesquisadores como uma evolução técnica direta do Shai-Hulud — “o primo enferrujado” — e marca uma nova etapa nos ataques contra cadeias de desenvolvimento.
A equipe da JFrog acompanhava os pacotes publicados pela conta npm asteroiddao, vinculada à organização GitHub asteroid-dao dentro do ecossistema de banco de dados descentralizado Arweave/WeaveDB, quando notou que todos os pacotes da conta haviam sido republicados na mesma janela curta de tempo. Cada nova versão trazia um binário nativo executado por hook de instalação. A investigação revelou um exemplar de 976 KB embarcado em tools/setup e disparado via preinstall definido no package.json — gatilho que roda antes mesmo de o npm começar a resolver dependências.
A OX Security, que também rastreou a campanha, contabilizou pelo menos 36 pacotes npm únicos com mais de 32 mil downloads mensais combinados. Os commits maliciosos foram atribuídos publicamente ao desenvolvedor ocrybit, membro das organizações Arweave comprometidas, cujas credenciais foram roubadas e usadas para empurrar código em todos os repositórios ao alcance da conta.
Pouco depois da publicação da pesquisa, parte das versões maliciosas foi marcada como deprecada no npm e vários dos commits sumiram do GitHub — mas a JFrog adverte que a conta comprometida tinha cerca de 4.500 contribuições privadas no mês, sugerindo que o impacto real pode ser bem maior do que a parte visível.
O binário é um ELF Linux empacotado com um stub UPX modificado: o atacante sobrescreveu o magic UPX! para enganar a detecção do unpacker padrão, mas restaurar o marcador permite desempacotar normalmente — um truque anti-análise de baixo custo. Por dentro, é uma build de release em Rust com runtime async, milhares de funções e strings criptografadas individualmente: não há uma chave única que desbloqueie tudo, cada call site usa parâmetros próprios, exigindo trabalho de engenharia reversa manual e demorado.
Decifradas, as strings entregaram o arsenal completo: endpoints da API do GitHub, listas longas de variáveis de ambiente associadas a credenciais de provedores cloud e de IA, caminhos de arquivos de credenciais no disco, identidades de bots vinculadas a IDs reais do GitHub, e templates de injeção de código para múltiplos ecossistemas de pacotes (npm, PyPI, Cargo, Conan e vcpkg).
“Esta é uma arma de supply-chain construída para encontrar segredos, modificar projetos e injetar código malicioso para se autopropagar pelo GitHub”, afirmam os pesquisadores da JFrog no relatório.
O malware adapta a carga ao alvo. Se o repositório distribui um pacote, o IronWorm derruba um binário em um caminho aparentemente inocente — tools/setup ou .github/scripts/precheck — e modifica o sistema de build para executá-lo: preinstall no npm, subprocess no setup.py do PyPI, build-script hook no Cargo. Esses commits chegam assinados pelo autor claude <claude@users.noreply.github.com>, imitando um assistente de IA para que o novo hook de build pareça automação de rotina.
Se o repositório já usa GitHub Actions, o caminho é mais sujo: o malware não cria um arquivo novo, ele substitui um workflow existente por um job de exfiltração de segredos. A engenharia social do ataque está em reaproveitar funcionalidades legítimas do Actions — a expressão ${{ toJSON(secrets) }} serializa todos os segredos do run em um único valor, despejados em um arquivo com nome banal (“format-results.txt”) e enviados como artefato de build. Sem C2 externo. Os commits dessa variante adotam identidades de bots familiares (dependabot, renovate, github-actions), porque um ajuste rotineiro de CI vindo de um desses é justamente o tipo de mudança que ninguém olha.
Os commits ainda chegam com datas forjadas: o malware copia o timestamp do último commit legítimo do repositório, fazendo a injeção parecer ter quatro, sete ou até treze anos de idade. Apenas o log do GitHub Actions revela a verdade.
O implante carrega um objeto BPF compilado com clang 22.1.5 que opera como rootkit de kernel. Ele reescreve o conteúdo de /proc em tempo real para esconder processos da lista de ps, top e ls; intercepta cada execve para esconder automaticamente processos cujo nome bate com uma watchlist; bloqueia ptrace contra processos protegidos com SIGKILL (rodar strace contra o malware pode matar o próprio shell que executou o comando); e filtra /proc/net/tcp e o netlink para remover conexões ocultas das ferramentas de rede. Em sistemas com kernel lockdown habilitado, parte desses truques falha silenciosamente — mas em servidores stock rodando como root o conjunto funciona inteiro.
O canal de comando e controle baixa o Tor expert bundle, escreve um torrc próprio, sobe o daemon e bate em /api/agent. Os comandos disponíveis incluem upload de segredos extraídos, drop de arquivos do servidor controlado pelo atacante e execução de shell remota. Há ainda um caminho de fallback que usa o serviço público temp.sh tunelado pelo Tor.
A capacidade de auto-replicação no npm é elegante e perigosa: quando rodando em ambiente CI, o malware solicita um token OIDC do CI, troca esse token no endpoint /-/npm/v1/oidc/token/exchange/package/<pkg> e recebe um token automation de curta duração escopado ao pacote. Com isso publica versão trojanizada — sem nunca tocar em credencial armazenada do npm.
ocrybit, asteroid-dao, alisista, warashibe, kakedashi-hacker, weavedb, ArweaveOasis, arthursimao e mlebjerg.~/.claude/.credentials.json, ~/.codex/auth.json, ~/Cursor/auth.json, ~/.gemini/settings.json, além dos clássicos ~/.aws/credentials, ~/.kube/config e ~/.docker/config.json.webSecurity, sandbox, contextIsolation, nodeIntegration) para capturar senha e seed mnemonic.Secrets e, se houver Vault, faz login com o mesmo token e enumera os backends.O IronWorm é a confirmação de uma tese que vinha se desenhando desde o Shai-Hulud em 2025: ataques de supply-chain estão deixando de ser scripts em JavaScript baratos e curtos para se tornarem implantes nativos completos, com runtime moderno, criptografia, persistência em kernel e canais ocultos. A escolha de Rust não é estética — é defensiva. Binários Rust são notoriamente difíceis de fazer engenharia reversa: trazem runtime async, milhares de funções de framework e padrões de chamada que afogam a lógica do próprio malware. Combinar isso com criptografia de string por call site, UPX modificado e rootkit eBPF eleva o custo de análise em ordens de magnitude — exatamente o ponto onde a maioria das equipes de SOC desiste.
A comparação direta com o Shai-Hulud é proposital. Os dois compartilham a ideia central: comprometer desenvolvedores, roubar credenciais e usar workflows confiáveis da cadeia de software para se espalhar — inclusive reaproveitando as mesmas mensagens de commit. Mas o IronWorm leva o conceito ao próximo nível em sofisticação, e essa elevação técnica é o que importa para a defesa. O modelo está se profissionalizando.
Há, porém, sinais claros de que o operador ainda está em rodada de testes. O objeto BPF foi compilado com clang 22.1.5 sem strip — sobraram 214 linhas verbatim de código-fonte e metadados que permitiram à JFrog reconstruir q2.bpf.c e entender a mecânica do rootkit. Pior ainda, o operador codificou no binário uma seed BIP-39 inteira para que o stealer não roubasse a própria carteira de teste durante desenvolvimento — uma pista de atribuição que reverte ao endereço Ethereum 0x7e28D9889f414B06c19a22A9Bd316f0AC279a4d6. A carteira está quase vazia, mas o erro operacional é significativo: indica que esta provavelmente não é a forma final da campanha, é o ensaio.
Para quem defende, o recado é simples: o tempo em que se podia confiar que um commit assinado por dependabot ou github-actions era seguro acabou. As identidades de bot viraram vetor. E o caminho de exfiltração via artefato de Actions, que não foi observado em produção mas está no código, é tecnicamente a parte mais perigosa do implante porque elimina a necessidade de C2 externo — segredos do CI viram um arquivo baixável por quem tem acesso ao repositório.
claude, dependabot[bot], renovate[bot], github-actions[bot] e outras identidades de automação fora do contexto normal de uso.asteroiddao e organizações relacionadas.Fonte: JFrog Security Research
Vulnerabilidade RCE no plugin Everest Forms Pro (CVSS 9.8) é explorada para sequestrar sites WordPress.…
O Programa Mundial de Alimentos da ONU confirmou intrusão à sua plataforma de auto-registro em…
CISA adicionou ao catálogo KEV a CVE-2026-28318 (CVSS 7.5) no SolarWinds Serv-U, sob exploração ativa.…
Grupo de extorsão ShinyHunters publica 234 GB de dados da DentaQuest após falha em negociação…
Ammar Askar publica proof-of-concept funcional que extrai tokens GitHub do VS Code com um clique…
Pesquisadores expõem como o SDK iOS da Bright Data, embarcado em apps gratuitos e smart…