Percio Castelo.
EN Início
Caça a bugs pé no barro: usando o grep para triagem rápida de segurança em javascript
← Voltar para blog

Caça a bugs pé no barro: usando o grep para triagem rápida de segurança em javascript

09/09/2026 · 3 min · Cibersegurança · 760 visualizações

Quem precisa auditar código no dia a dia sabe que a teoria é ótima, mas na prática muitas vezes preciso de respostas imediatas. Recentemente, precisei fazer uma triagem rápida (triage) em alguns arquivos JavaScript para identificar possíveis injeções de código malicioso, backdoors ou vulnerabilidades clássicas.

Existem ferramentas completas de análise estática (SAST) para isso, mas quando você está direto no terminal de um servidor ou analisando um pacote suspeito, o que resolve primeiro é o bom e velho grep.

Abaixo, compartilho os comandos que compilei para fazer essa varredura inicial de forma direta e sem complicações.


O problema: triagem rápida vs. o buraco negro do node_modules#

O desafio inicial era rodar uma busca em diretórios de projetos Node / Front-end sem que o terminal travasse tentando ler os milhares de arquivos da pasta node_modules, capturando funções perigosas via Expressões Regulares (Regex).

O comando geral que utilizo para uma primeira varredura ampla é:

grep -rnEI --include='*.js' --exclude-dir=node_modules "(eval\(|setTimeout\([^,]+,|setInterval\([^,]+,|atob\(|btoa\(|innerHTML|document\.write\(|child_process|exec\(|spawn\(|Function\()" .
  • Por que funciona bem: A flag -r ativa a busca recursiva, o -n exibe o número exato da linha e o -E habilita expressões regulares estendidas. O segredo prático é o --exclude-dir=node_modules, que impede o comando de se perder nas dependências de terceiros.

Segmentando a varredura por tipo de ameaça#

Como uma busca genérica pode trazer muitas ocorrências, costumo dividir a investigação pelo tipo de padrão que estou investigando:

1. Código ofuscado e backdoors#

Invasores costumam esconder scripts maliciosos através de ofuscação.

Para identificar execução dinâmica de código (muito comum em web shells e loaders):

grep -rnE "eval\(|Function\(|setTimeout\(['\"]|setInterval\(['\"]" arquivo.js

Para localizar cargas codificadas em Base64:

grep -rnE "atob\(|btoa\(" arquivo.js

Para capturar sequências longas em Hexadecimal ou Unicode:

grep -rnE "(\\x[0-9a-fA-F]{2}){4,}|(\\u[0-9a-fA-F]{4}){4,}" arquivo.js

Dica útil: Códigos maliciosos costumam ser inseridos como uma linha única gigantesca no final do arquivo. O awk ajuda a isolar linhas com mais de 500 caracteres:

awk 'length($0) > 500' arquivo.js

2. Vulnerabilidades de DOM XSS (front-end)#

Se a análise for no código do navegador, o foco passa a ser a manipulação insegura de elementos do DOM:

Para identificar injeções diretas no HTML:

grep -rnE "\.innerHTML|\.outerHTML|document\.write\(|document\.writeln\(" arquivo.js

Para detectar redirecionamentos abertos (frequentemente usados em golpes de phishing):

grep -rnE "window\.location|location\.href|location\.replace" arquivo.js

3. Injeção de comandos e leitura de arquivos (back-end / Node.js)#

No lado do servidor, o risco é de execução arbitrária no sistema operacional:

Para Command Injection:

grep -rnE "require\(['\"]child_process['\"]\)|exec\(|execSync\(|spawn\(|spawnSync\(" arquivo.js

Para Path Traversal (leitura ou escrita arbitrária no disco):

grep -rnE "fs\.readFile\(|fs\.readFileSync\(|fs\.writeFile\(" arquivo.js

Conclusão: do grep pontual às esteiras de análise automatizada#

O grep é excelente para uma checagem rápida no terminal, mas não interpreta o contexto do código: ele vai acusar um eval() mesmo se estiver comentado ou se for parte de um polyfill legítimo.

Para uma auditoria de emergência via SSH, esses filtros resolvem o problema em segundos. Para manter a segurança contínua nos projetos, o próximo passo natural é incorporar regras no Semgrep ou adicionar plugins de segurança no ESLint dentro do pipeline de desenvolvimento.

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

760 leituras
Creative Commons Atribuição-NãoComercial

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários