Ofuscação de JavaScript: de brincadeira a kit de phishing

Tradução automática do conteúdo disponibilizado no feed de Cisco Talos. Original: https://blog.talosintelligence.com/javascript-obfuscation-from-party-trick-to-phishing-kit/

Abrimos um artefato JavaScript esperando encontrar código e, em vez disso, vemos arrays de strings, funções com nomes estranhos, URLs codificadas, decodificadores em tempo de execução e instruções eval. Esse é o ponto em que “ler o script” deixa de ser suficiente. JavaScript ofuscado ainda é código, mas com o contexto útil removido, nomes destruídos, strings ocultas e comportamento real deslocado para o tempo de execução. Ele aparece em páginas de phishing, loaders de malware, scripts suspeitos de navegador e, ocasionalmente, em proteções legítimas de software que assumem aparência suspeita. Nos últimos anos, passei bastante tempo desmontando JavaScript suspeito de kits de phishing, pacotes de malware, sites comprometidos e outros locais onde o código legível foi deliberadamente ocultado. Posso não ser um reverser de JavaScript de classe mundial, mas aprendi truques suficientes para fazer a confusão se explicar. Nesta publicação, apresentarei o que é ofuscação, por que tentar ultrapassá-la e algumas formas de abordar o problema. Aviso: muitos códigos e exemplos totalmente artificiais a seguir. Antes de tocar no código estranho, presuma que a amostra é hostil. Trabalhe em uma cópia, preserve o original e não execute JavaScript desconhecido em sua máquina normal, no perfil normal do navegador ou em qualquer lugar onde estejam disponíveis credenciais úteis, conteúdo da área de transferência, agentes SSH, tokens npm, credenciais de nuvem ou detalhes de proxy corporativo. Isso inclui análises assistidas por IA. Ferramentas de IA são úteis aqui, mas não são um sandbox nem uma fonte de evidências. Use-as em trechos isolados, artefatos decodificados e cargas recuperadas que você se sinta confortável em compartilhar com a ferramenta em uso. O objetivo não é evitar IA, mas evitar enviar material hostil ou sensível para locais que você não controla. As perguntas úteis são simples: O que lê? O que grava? Para onde se conecta? Que código gera? Quais condições alteram seu comportamento? O que acontece com um usuário, desenvolvedor ou executor de build real? Ofuscação é um termo geral para transformações que preservam a execução enquanto ocultam a intenção. Nem toda ofuscação é maliciosa, mas pode ser motivo para examinar mais de perto. Usos benignos incluem empacotamento/minificação para desempenho, proteção de propriedade intelectual e controles antiviolação. Usos suspeitos incluem ocultar exfiltração de credenciais em phishing, loaders de malware, abuso de extensões de navegador, scripts de instalação de pacotes npm, injeções em sites comprometidos e fluxos falsos de CAPTCHA e atualização. Embelezar o código não basta: ferramentas como Biome ou Prettier restauram indentação e quebras de linha, mas não recuperam nomes originais, intenção, estrutura removida ou strings decodificadas. Minificação reduz o tamanho do código; empacotamento comprime ou codifica o código real e o reconstrói em tempo de execução. A abordagem usual é encontrar a etapa de desempacotamento e capturar o resultado. Substitua sinks de execução por registro, capture cargas intermediárias e analise a próxima camada separadamente. Técnicas comuns incluem ocultação de strings e identificadores, acesso dinâmico a propriedades, código morto e ruído, geração dinâmica de código, achatamento do fluxo de controle, antidepuração e anti-análise, além de JSFuck. Ferramentas como o pacote npm javascript-obfuscator automatizam renomeação de identificadores, arrays de strings, codificação, rotação, achatamento de fluxo, injeção de código morto, proteção contra depuração, autodefesa, bloqueios de domínio e desativação da saída do console. No Node.js, JavaScript ofuscado pode acessar process.env, o sistema de arquivos, processos filhos, diretórios pessoais, tokens npm, tokens do GitHub, chaves SSH e variáveis de CI. O fluxo recomendado é preservar o original, criar uma cópia segura, embelezar como primeira etapa, extrair strings, identificar sinks de execução, capturar cargas geradas, observar o comportamento em ambiente controlado e repetir até que o código deixe de se esconder atrás de cerimônia. A IA pode ajudar a explicar decodificadores isolados, renomear variáveis, resumir cargas recuperadas e documentar a análise, mas não é um oráculo mágico de malware nem um sandbox. As formas mudam, mas o trabalho é o mesmo: transformar comportamento oculto em comportamento observável.