O resumo operacional, na ordem exata em que precisa ser executado:
- Identificar. Rodar
npm ls tensorlakee procurar0.5.144em lockfile, log de build e artefato publicado. - Isolar. Toda máquina onde o script de instalação rodou deve ser tratada como comprometida. Remover a dependência não remove o implante.
- Remover a persistência antes de revogar qualquer credencial. O serviço
gh-token-monitorsai primeiro. - Só então rotacionar: npm, nuvem, SSH, Kubernetes, Vault, segredo em
.env, chave de ferramenta de IA e senha salva no navegador.
A inversão dessa ordem é o ponto da matéria. Em incidente de credencial a reação treinada é revogar o token primeiro. Aqui, revogar primeiro é o que aciona a limpeza do diretório do usuário.
A linha do tempo
O primeiro commit malicioso entrou no branch main do repositório tensorlakeai/tensorlake em 7 de outubro, às 01h20 UTC, assinado com a identidade de um mantenedor. Outros sete vieram nas horas seguintes, ajustando a carga e acrescentando a linha de preinstall ao package.json. Nenhum passou por pull request. Quase 24 horas depois, em 8 de outubro às 01h12 UTC, o fluxo de release do próprio repositório publicou a 0.5.144 no npm. A Socket marcou o pacote às 01h23, onze minutos depois.
A Aikido fala em mais de 100 mil instalações acumuladas. A Socket mede cerca de 12 mil downloads semanais e faz a ressalva correta: isso é uso do pacote, não número de máquinas infectadas.
Vale parar na atestação. O npm exibe procedência válida porque o artefato foi construído a partir daquele repositório, por aquele fluxo, com aquela identidade. A cadeia de assinatura estava impecável. O que estava errado era o código. Procedência responde onde o pacote nasceu e nunca o que ele faz, e quem tratou Sigstore como selo de segurança acabou de receber a fatura dessa confusão.
A cadeia de execução
- O package.json traz
"preinstall": "node lib/setup.mjs". Não é preciso importar nada nem subir agente. Basta um npm install em ambiente onde script de ciclo de vida é permitido. - O setup.mjs é um carregador ofuscado. Ele detecta CI e se desliga, segundo a StepSecurity. O alvo é a estação do desenvolvedor, não o runner.
- Ele baixa o runtime Bun e usa o Bun para executar lib/Math_Symbol.js, 856 KB ofuscados.
- O payload ainda busca um binário HackBrowserData compatível com a plataforma da máquina, para raspar credencial guardada no navegador.
A escolha do Bun é esperta e desagradável em partes iguais. Traz um interpretador novo para a máquina, fora da lista de processos que a maioria das regras de detecção espera ver sendo chamada por um script de npm.
O que ele leva
| Categoria | Alvos |
|---|---|
| npm | arquivos .npmrc, API de token e troca de token OIDC |
| GitHub | token, com verificação de permissão de repositório e de workflow |
| AWS | IMDS, ECS, Secrets Manager e SSM Parameter Store |
| HashiCorp Vault | instância local em 127.0.0.1:8200, inclusive caminhos de autenticação por Kubernetes e AWS |
| Kubernetes | token de service account e arquivo kubeconfig |
| Chaves e segredos | SSH, GPG, TLS, arquivos .env, configuração de Docker e Helm, cofre de gerenciador de senha |
| Criptomoeda | carteiras de Ethereum, Monero, Bitcoin e Near, e 14 extensões de navegador, entre elas MetaMask, Phantom e Ronin |
| Ferramentas de IA | arquivos de configuração e de MCP em .claude, .cursor, .kiro, Windsurf e Zed |
A última linha é a novidade de 2026. O que até outro dia era pasta de dotfile virou cofre: chave de API de modelo, token de servidor MCP, configuração de agente com permissão de escrita no repositório. Quem adotou assistente de código sem inventariar o que ele guarda em disco ganhou um item novo na lista de ativos críticos, e provavelmente ainda não o colocou lá.
Como ele se espalha
Com o token do npm, o verme enumera os pacotes ligados à identidade de publicação da vítima, se acrescenta a eles, sobe a versão, constrói procedência Sigstore e republica. Com o token do GitHub, escreve .claude/settings.json e .vscode/tasks.json nos repositórios alcançáveis, com autor falso claude@users.noreply.github.com e mensagem de commit "chore: update dependencies". Esses arquivos executam a carga de novo quando alguém abre o projeto no Claude Code ou no VS Code.
O endereço de comando e controle não está no binário. O payload consulta um contrato na rede Ethereum, por cerca de 30 endpoints RPC públicos, e tem o GitHub como alternativa, onde o dado roubado fica cifrado em repositório público com a descrição "Shai-Hulud: Here We Go Again". A Aikido registra que o contrato foi atualizado pela última vez em 21 de setembro de 2026, apontando para o domínio iseekaigogo[.]com.
O vigia
É aqui que o incidente muda de categoria. Quando o payload obtém um token do GitHub, instala o gh-token-monitor e passa a consultar api.github.com/user a cada 60 segundos, por até 24 horas. Se o GitHub recusar o token, o monitor executa um comando entregue pelo atacante via Invoke-Expression. Na análise da StepSecurity, esse comando é um rm -rf no diretório do usuário, ou a remoção do perfil no Windows. O arquivo carrega a cadeia literal IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner, já vista em ondas anteriores do Shai-Hulud.
Onde ele mora:
- Linux: serviço de usuário systemd gh-token-monitor.service, script em ~/.local/bin/gh-token-monitor.sh e configuração em ~/.config/gh-token-monitor/.
- macOS: LaunchAgent com.user.gh-token-monitor.plist em ~/Library/LaunchAgents/.
- Windows: tarefa de logon no Agendador de Tarefas executando monitor.ps1.
Para remover: systemctl --user disable --now gh-token-monitor.service e apagar ~/.config/gh-token-monitor/ no Linux, descarregar o plist no macOS, excluir a tarefa de logon no Windows. Faça backup do que importa antes, porque o risco está do lado da revogação e não do lado da remoção.
Indicadores
- Pacote tensorlake@0.5.144.
- lib/setup.mjs, SHA-256 25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef.
- lib/Math_Symbol.js, SHA-256 b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec.
- Domínio iseekaigogo[.]com.
- Repositório público com "Shai-Hulud" na descrição dentro da conta do GitHub.
- Commit de claude@users.noreply.github.com e arquivos .claude ou .vscode que ninguém criou.
A correção que vale depois desta semana
Fixar a 0.5.143, apagar node_modules e limpar o cache do npm resolve hoje. O que resolve o próximo caso é ignore-scripts=true no .npmrc, com exceção declarada e revisada para o punhado de pacotes que de fato precisa de hook de instalação. Se o pacote só rodou em CI, rotacione mesmo assim os segredos que aquele job alcançava.
Vale ainda olhar a proteção do branch nos repositórios que publicam pacote. Oito commits diretos no main, sem uma única revisão, em um projeto com mais de mil estrelas: foi isso que abriu a porta. A publicação automatizada só fez o resto do caminho com a assinatura certa.
Outras correções e falhas do dia
- Cisco
Nexus com execução remota como root
A versão de endurecimento de outubro do NX-OS trouxe seis CVEs, com a NX-API em CVSS 9.8 (CVE-2026-76471) e execução remota não autenticada como root no componente NGOAM (CVE-2026-76485). Não há mitigação por configuração.
- Citrix
NetScaler em implantação SAML
A Citrix corrigiu um estouro de memória no NetScaler que pode levar a execução remota de código ou negação de serviço em ambientes configurados com SAML.
- Cadeia de suprimentos
FakeGit volta com 17.610 repositórios
A campanha FakeGit reapareceu com 17.610 repositórios maliciosos publicados no GitHub, desenhados para aparecer na busca de quem procura ferramenta legítima.
- Navegador
Dezesseis extensões do Firefox atrás da frase de recuperação
Um conjunto de 16 complementos se passava por Rabby e OKX Wallet para capturar frase de recuperação e chave privada de carteira de criptomoeda.
- Dispositivo
Celular Android barato com proxy residencial de fábrica
Aparelhos Android de baixo custo foram encontrados saindo de fábrica com malware que transforma o telefone em nó de proxy residencial, revendido depois como endereço IP legítimo.
Fontes e aprofundamento
- Socket · Tensorlake npm SDK compromised, cronologia em UTC, cadeia de preinstall, alvos de credencial e os hashes dos dois arquivos.
- StepSecurity · Tensorlake npm package compromised with a hostage-token worm, os oito commits diretos no main, a persistência por sistema operacional e a ordem de resposta.
- Aikido Security · tensorlake NPM package compromised with Shai-Hulud worm, mais de 100 mil instalações acumuladas e o contrato de comando e controle na Ethereum.
- npm · Pacote tensorlake no registro público, para conferir a versão em uso e fixar a 0.5.143.