← Início / Artigos Técnicos / Vulnerabilidades ReDoS
Segurança Web & CWE-1333

Vulnerabilidades ReDoS: Como Regex Insegura Trava Servidores Node.js

Por Equipe Técnica Caixa do Dev • Tempo de leitura: 9 minutos • Atualizado em Outubro de 2026

Expressões Regulares (Regex) são ferramentas indispensáveis no kit de qualquer desenvolvedor. Elas validam formulários, limpam logs, realizam buscas e roteiam URLs com extrema concisão. No entanto, quando escritas sem rigor algorítmico, uma única linha de regex pode se tornar um dos vetores de ataque de negação de serviço mais destrutivos do ecossistema web: o ReDoS (Regular Expression Denial of Service), catalogado como CWE-1333.

Em ambientes single-threaded assíncronos como o Node.js, o impacto é devastador. Como o motor V8 processa expressões regulares de forma síncrona na thread principal, uma chamada ReDoS bloqueia a Event Loop por minutos ou até horas, fazendo com que 100% das requisições de todos os outros usuários fiquem congeladas.

1. A Mecânica do Backtracking Catastrófico

Para entender por que o ReDoS acontece, precisamos compreender como a maioria dos motores de regex modernos (em linguagens como JavaScript, Python, Java, PHP e .NET) funciona. Eles utilizam Autômatos Finitos Não-Determinísticos (NFA) com algoritmo de backtracking recursivo.

Considere a clássica expressão ambígua:

/^(a+)+$/

Quando testada contra a string "aaaaa", o casamento ocorre em microssegundos. Porém, o que acontece se o atacante enviar a string "aaaaaaaaaaaaaaaaaaaaaaaaaaaa!" (28 caracteres 'a' seguidos de uma exclamação que falha a correspondência)?

A Explosão Combinatória:

O motor consome todos os 'a's, chega ao '!' e percebe que o casamento falhou. Em vez de simplesmente rejeitar, o motor NFA começa a testar todas as combinações possíveis de agrupar esses caracteres entre o + interno e o + externo: (1 e 27), (2 e 26), (1, 1 e 26)... Para uma string de comprimento n, o número de caminhos testados é proporcional a 2n (complexidade exponencial). Com apenas 30 caracteres, são mais de 1 bilhão de passos computacionais!

2. O Caso Real do Cloudflare em 2019

Em 2 de julho de 2019, o Cloudflare sofreu uma interrupção global massiva que derrubou milhões de sites na internet por 27 minutos. A causa raiz? Uma nova regra de firewall (WAF) implantada para detectar ataques XSS continha a seguinte sub-expressão regular:

(?:(?:\"|'|\]|\}|\\d|(?:nan|infinity))\s*?:[\s\S]*?[\{\[])

A presença de .* repetido em conjunto com operadores não-gananciosos causou backtracking severo nos nós centrais da CDN, levando o consumo de CPU a 100% simultaneamente em dezenas de datacenters mundiais.

3. Os Padrões Mais Perigosos (Evil Regex)

Identificar padrões vulneráveis no código é a melhor forma de blindar sua aplicação:

Padrão Vulnerável Exemplo de Evil Regex Payload Malicioso
Agrupamento Aninhado (a+)+$ "aaaaaaaaaaaaaaaaa!"
Alternância Sobreposta (a|aa)+$ "aaaaaaaaaaaaaaaaa!"
Validação Ingênua de Email ^([a-zA-Z0-9_\.-]+)+@ "a.a.a.a.a.a.a.a.a.a.a!"
Prefixos Repetidos Opcionais (a|a?)+$ "aaaaaaaaaaaaaaaaa!"

4. Como Proteger sua Aplicação contra ReDoS

A. Limite o Comprimento das Entradas (Input Length Capping)

A grande maioria dos ataques ReDoS exige strings com 30 a 200 caracteres para causar congelamento perceptível. Se você está validando um nome de usuário, aplique um limite estrito antes de invocar a regex:

if (input.length > 50) {
  throw new Error("Tamanho de entrada excedido.");
}
        

B. Utilize Motores com Complexidade Linear (Google RE2)

O motor RE2 do Google substitui NFAs com backtracking por autômatos que garantem execução em tempo linear O(n) em relação ao tamanho da string de entrada, tornando ataques ReDoS matematicamente impossíveis:

// No Node.js (via pacote re2)
const RE2 = require('re2');
const regexSegura = new RE2('^([a-zA-Z0-9_.-]+)@([a-zA-Z0-9_.-]+)$');
console.log(regexSegura.test("usuario@empresa.com.br")); // Seguro contra DoS
        

Perguntas Frequentes sobre ReDoS (FAQ)

O JavaScript no navegador também sofre com ReDoS?+
Sim. Uma regex maliciosa ou mal formatada rodando no navegador trava a aba do usuário, causando o congelamento da interface até que o navegador exiba a mensagem de alerta para interromper a execução do script.
Ferramentas de SAST detectam ReDoS automaticamente?+
Sim. Ferramentas como SonarQube, Snyk, Semgrep e linters como eslint-plugin-security analisam a árvore sintática da regex e alertam sobre padrões ambíguos propensos a backtracking exponencial.
Por que nem todo motor de regex usa tempo linear como o RE2?+
Porque motores lineares não suportam recursos avançados como backreferences (ex: \1 para casar a mesma tag HTML de abertura e fechamento) e lookaround arbitrário, que dependem formalmente de backtracking.
CD

Editorial Técnico Caixa do Dev

Artigos originais e guias técnicos produzidos com rigor matemático, código aberto e conformidade com especificações da IETF (RFCs), W3C e ISO/IEC para desenvolvedores.

Testar Padrões no Testador de Regex → ← Ver Todos os Artigos