antd-img-crop: um force push trocou o main por um commit forjado que instala um stealer no npm run build
Se você clonou o repositório do antd-img-crop (o componente de recorte de imagem do Ant Design, com uns 98 mil downloads por semana no npm) desde 31/10 e rodou npm run build, pare e confira a máquina. A SafeDep publicou que o main do repositório no GitHub foi trocado por um commit forjado que baixa o OverLord, um stealer de credenciais e carteiras de cripto para macOS, Linux e Windows. O pacote publicado no npm não foi afetado: a versão mais recente continua a 4.30.0, publicada em 12/03.
Conferi hoje (03/11) pela API do GitHub, e o main continua apontando para o commit forjado, o 2aa8504.
O commit que finge ser de março
O commit se apresenta como o release 4.30.0, com o autor de sempre e a data de 12/03. Ele é uma reconstrução do commit real, com duas mudanças: um script novo, scripts/prebuild.js, e esta linha no package.json:
"prebuild": "node scripts/prebuild.js"
O npm roda o prebuild antes de qualquer npm run build, sem perguntar. O script baixa um instalador falso, que prepara um Node.js e busca um JavaScript criptografado, executado em memória, que acha o servidor de comando por um repositório usado de dead-drop no GitLab.
Autor e data de commit no Git são o que quem cria o commit quiser, então a lista de commits do GitHub mostra 12/03. O que denuncia é o push, que fica registrado pelo GitHub e não pelo commit. Dá para ver pela API:
gh api repos/nanxiaobei/antd-img-crop/activity --jq '.[0] | {timestamp, activity_type, ref}'
A saída é um force_push em refs/heads/main às 15:12 UTC de 31/10. A SafeDep cita a perda do selo "Verified" como outro sinal, mas aqui ele não ajudaria: os commits anteriores desse repositório também não são assinados.
O que ele leva
Senhas e cookies de navegadores, o Keychain do macOS e o keyring do Linux, extensões de carteira (MetaMask, Phantom, Rabby), umas 34 carteiras desktop, as chaves de linha de comando de Solana, Sui, NEAR e Foundry, e também .env, .npmrc, .gitconfig, chaves SSH e cofres .kdbx. No macOS e no Linux, ele abre uma janela falsa pedindo a senha do sistema. Depois fica como um "atualizador do Google" e dá ao operador shell remoto e transferência de arquivos.
A mesma conta já tinha posto um dropper parecido no tema Hugo hugo-paper em 21/08, removido em 21/10. A SafeDep considera que a conta do mantenedor continua comprometida.
As outras portas da mesma campanha
A campanha tem mais duas portas, ambas mirando dev: um portal falso de vagas da Amber Group, que no fim pede para colar um comando de "verificação" no terminal, e uma extensão instalada por fora da loja no VS Code ou no Cursor, a google-dev-tools.google-update-support. A SafeDep diz que as técnicas batem com as da campanha Contagious Interview (recrutador falso, teste técnico, comando colado), sem afirmar quem está por trás. Se aparecer processo seletivo pedindo para rodar algo no seu terminal, desconfie.
O que eu conferiria
1. Se você rodou o build de um clone. git log -1 --format=%h mostrando 2aa8504, ou um prebuild no package.json, é o caso.
2. A persistência, um nome por sistema:
# macOS
launchctl list | grep com.google.UpdateSupporter
# Linux
systemctl list-unit-files | grep google-agent; systemctl --user list-unit-files | grep google-agent
# Windows (cmd)
schtasks /query /tn GoogleUpdateSupporterNode
# VS Code e Cursor
code --list-extensions | grep google-update-support; cursor --list-extensions | grep google-update-support
3. Se achou algo, eu trataria a máquina como comprometida e trocaria tudo de outra máquina: token do npm, chaves SSH, segredos dos .env, sessões dos navegadores e, se tiver, as carteiras. A lista completa de indicadores (domínios, hashes) está no CSV da SafeDep.
4. Para os próximos clones, vale deixar os hooks desligados por padrão:
npm config set ignore-scripts true
Segundo a documentação do npm, com isso o npm run build ainda roda o build, mas não roda o prebuild nem o postbuild, e o npm install não roda os scripts de instalação dos pacotes. Quebra alguns projetos que dependem de postinstall, então é para ligar sabendo disso.
Fonte primária: análise da SafeDep.