Vulnerabilidades ReDoS: Como Regex Insegura Trava Servidores Node.js
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)
eslint-plugin-security analisam a árvore sintática da regex e alertam sobre padrões ambíguos propensos a backtracking exponencial.\1 para casar a mesma tag HTML de abertura e fechamento) e lookaround arbitrário, que dependem formalmente de backtracking.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.