Um cliente falso inseriu um repositório malicioso do GitHub na minha caixa de entrada esta semana e, apenas ao executar o script inicial, apagou dois dias de trabalho e expôs todas as senhas que mantenho no meu navegador.
O “cliente” postou uma vaga de engenheiro sênior com alta remuneração, enviou mensagens rapidamente e mandou um repositório com aparência profissional. O pedido era simples: clonar, executar npm run dev e enviar um print para provar que a demonstração funcionava — sem contrato, sem verificação de antecedentes. No momento em que o servidor de desenvolvimento iniciou, um código oculto em um arquivo de configuração comunicou-se com um servidor de comando e controle (C2), buscou um payload de segunda etapa e começou a drenar credenciais da máquina local.
Como o ataque se desenrolou
O payload malicioso estava no postcss.config.js, um arquivo que a maioria dos desenvolvedores ignora porque geralmente contém apenas algumas regras simples de processamento de CSS. Neste caso, o invasor anexou uma linha de JavaScript ofuscado bem à direita de uma instrução legítima, preenchida com espaços para passar despercebida. Quando o comando npm run dev executou o pipeline do PostCSS, a linha oculta foi executada sem ser notada.
O malware realizou três etapas em rápida sucessão:
- Contato com o C2 – abriu uma conexão de rede com um servidor controlado pelo invasor e anunciou o host comprometido.
- Download de segunda etapa – baixou código adicional que continha a lógica real de exfiltração de dados.
- Roubo de credenciais do navegador – no macOS, ele consultou a chave Chrome Safe Storage armazenada no keychain do sistema. Se o usuário aprovasse o prompt do keychain, o invasor coletava todas as senhas salvas no Chrome.
Além do roubo imediato, o payload se escreveu em várias ferramentas comuns de desenvolvedor — VS Code, npm, Discord — para que qualquer inicialização futura dessas aplicações reinstituísse o código malicioso. Um simples reinício não limpou a infecção; o próximo npm install ou a abertura do editor reativava o backdoor.
Sinais de alerta que costumam passar despercebidos
- Pedidos para executar código antes de qualquer contrato ser assinado. Processos de contratação legítimos geralmente envolvem um acordo formal antes que qualquer trabalho proprietário seja compartilhado.
- Arquivos compactados disfarçados de “briefings de projeto”. Arquivos Zip ou RAR podem esconder scripts executáveis ou binários maliciosos.
- Pedidos de endereços de e-mail pessoais para “burlar os filtros da plataforma”. Esse estratagema retira a conversa da plataforma protegida, onde abusos podem ser denunciados.
- Descrições de vagas que pedem ao candidato para financiar uma carteira de criptomoedas ou comprar tokens de teste. Tais exigências são atípicas para trabalhos de desenvolvimento genuínos.
Passos práticos para manter a segurança
- Nunca execute o código de um estranho sem inspeção. Abra o repositório em uma visualização de apenas leitura (por exemplo, através da visualização de arquivo "raw" no GitHub) e examine cada script, especialmente arquivos de configuração e entradas de
scriptsnopackage.json. - Trate todos os anexos como texto simples. Se um arquivo zip for enviado, extraia-o em um ambiente isolado (sandbox) e examine o conteúdo antes de abrir qualquer coisa.
- Use um gerenciador de senhas dedicado em vez do armazenamento do navegador. Mesmo que o keychain do navegador seja comprometido, o cofre do gerenciador permanece isolado.
- Execute código não confiável em uma máquina virtual ou container isolado, sem acesso à rede. Isso bloqueia a capacidade do invasor de alcançar um servidor C2.
- Ative a autenticação de dois fatores (2FA) em todas as contas. Se uma senha for roubada, o segundo fator impede logins não autorizados.
- Mantenha as ferramentas de desenvolvedor atualizadas e ative verificações automáticas de integridade, quando disponíveis. Alguns editores agora avisam quando arquivos principais são modificados inesperadamente.
Se você suspeitar que executou um código malicioso, assuma que o sistema está comprometido. Faça backup dos dados essenciais, formate o disco e reinstale o sistema operacional. Um simples reinício não erradicará um mecanismo de persistência que reescreve arquivos em aplicativos comuns.
Resumo: uma única linha de JavaScript oculto pode transformar uma demonstração de rotina em uma operação completa de roubo de credenciais. Trate cada repositório como não confiável até verificá-lo e torne o isolamento uma parte padrão do seu fluxo de trabalho. O custo de um momento de pressa supera em muito o esforço gasto ao conferir um arquivo duas vezes.
