Uma ferramenta criada para proteger senhas foi usada para roubá-las. A versão 2026.4.0 do @bitwarden/cli ficou disponível no npm por menos de duas horas na última terça-feira (22), carregando um malware que furtava credenciais de desenvolvedores, de chaves SSH a tokens de nuvem.
O caso ocorreu após atacantes sequestrarem o pipeline de publicação da Bitwarden, sem deixar rastros no repositório. Por sua vez, a empresa confirmou o incidente e afirma que nenhum dado de vault de usuários foi comprometido. O ataque atinge um dos gerenciadores de senhas mais adotados no mercado corporativo. A ferramenta serve mais de 10 milhões de usuários e 50 mil empresas, segundo a Socket, uma das empresas responsáveis pela investigação.
Como o pipeline da Bitwarden foi comprometido
O ponto de entrada foi a conta GitHub de um engenheiro da Bitwarden. Com o acesso em mãos, o atacante criou um branch no repositório bitwarden/clients, inseriu um tarball malicioso pré-compilado e reescreveu o workflow publish-cli.yml para trocar um token OIDC do GitHub Actions por um token de autenticação do npm, publicando o pacote adulterado diretamente no registro.
Depois de concluir a publicação, o atacante apagou todas as evidências no repositório, incluindo o branch, o histórico de execuções do workflow e a tag de release. O pacote permaneceu disponível no npm como único artefato remanescente.

O incidente é considerado o primeiro caso confirmado em que o mecanismo de OIDC Trusted Publishing do npm foi explorado como vetor de ataque. Esse recurso foi criado justamente para eliminar tokens de longa duração, mas não oferece restrições por branch. Qualquer branch comprometido no repositório tinha permissão para publicar no npm.
O que o malware fazia
O pacote comprometido mantinha a funcionalidade original do CLI. Desenvolvedores que instalaram a versão 2026.4.0 recebiam uma ferramenta funcional, sem mensagens de erro e sem qualquer sinal visível de problema.
Por baixo, um hook de preinstalação executava bw_setup.js antes de qualquer interação do usuário. Esse loader baixava o runtime Bun, um ambiente JavaScript alternativo ao Node, e usava-o para executar o payload principal, bw1.js, 9,7 MB de JavaScript ofuscado. A escolha do Bun é deliberada.
Regras de detecção em EDRs e SIEMs monitoram processos suspeitos do Node durante instalações de pacotes. Um processo bun passa despercebido pela maioria dessas ferramentas.

O stealer rastrear, em paralelo, três categorias de alvos. Credenciais locais incluíam chaves SSH, configurações do Git, histórico de shell, tokens npm e GitHub, credenciais AWS e GCP e arquivos .env. Em ambientes de CI/CD com a variável GITHUB_ACTIONS=true, o malware ativava um módulo específico para extrair o token de sessão do GitHub CLI via memory scraping do processo Runner.Worker e enumerar todos os repositórios acessíveis.
A terceira categoria é incomum para ataques desse tipo. O malware enumerava explicitamente ferramentas de codificação com IA, incluindo Claude Code, Cursor, Kiro, Codex CLI e Aider. Arquivos como ~/.claude.json e configurações de servidores MCP eram tratados como alvos prioritários, no mesmo nível de tokens de nuvem.
Além do roubo, o malware garantia persistência injetando o payload nos arquivos ~/.bashrc e ~/.zshrc, e usava um lock file em /tmp/tmp.987654321.lock para evitar múltiplas execuções simultâneas.

Exfiltração, fallback e atribuição complicada
Os dados coletados eram criptografados com AES-256-GCM e enviados para audit.checkmarx.cx, domínio registrado para imitar telemetria legítima da Checkmarx. Se esse canal fosse bloqueado, o malware criava repositórios sob a conta da própria vítima e enviava os dados para lá, tornando o tráfego indistinguível de uso normal da API do GitHub.
Os repositórios seguem uma nomenclatura temática do filme Duna no formato palavra-palavra-três dígitos, com termos como atreides, sandworm e harkonnen. Strings ideológicas embutidas no código, como “Shai-Hulud: The Third Coming” e referências ao “Butlerian Jihad”, indicam conexão com uma campanha de supply chain que emergiu no ano passado, mas com assinatura operacional diferente.
Outro sinal que complica a atribuição é um kill switch, no qual o malware encerra a execução silenciosamente se detectar que o locale do sistema começa com “ru”, verificando variáveis como LC_ALL, LC_MESSAGES e LANG. A Socket aponta que a infraestrutura é compartilhada com o grupo TeamPCP, mas as diferenças sugerem um operador distinto, um subgrupo ou uma evolução na postura da campanha.

Como se proteger
Apenas quem instalou a versão 2026.4.0 pelo npm no período afetado está exposto. A recomendação é desinstalar o pacote com npm uninstall -g @bitwarden/cli, limpar o cache com npm cache clean –force e instalar a versão 2026.4.1.
Todas as credenciais presentes na máquina devem ser rotacionadas, incluindo tokens GitHub e npm, chaves SSH, credenciais de nuvem e chaves de API armazenadas em ~/.claude.json ou configurações de MCP.
Pipelines de CI/CD que executaram a instalação devem ser tratados como totalmente comprometidos, com auditoria de workflows, branches inesperados e repositórios públicos criados recentemente. Um CVE está sendo emitido para a versão 2026.4.0.
Acompanhe o TecMundo nas redes sociais. Para mais notícias de segurança e tecnologia, inscreva-se em nossa newsletter e canal do YouTube.
