mediumCWE-1333A05:2021

ReDoS (Denegación de Servicio por Regex)

Las expresiones regulares con cuantificadores anidados pueden tomar tiempo exponencial con ciertos inputs, congelando el event loop de Node.js.

Cómo Funciona

El motor de regex de JavaScript usa backtracking. Un patrón como /(a+)+$/ aplicado a una cadena como 'aaaaaaaaab' hace que el motor explore un número exponencial de caminos antes de fallar. Como Node.js es single-threaded, una sola request maliciosa puede bloquear todo el servidor por segundos.

Código Vulnerable
// MAL: cuantificadores anidados causan backtracking catastrófico
const emailRegex = /^([a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)+@/;
if (emailRegex.test(userInput)) { /* ... */ }
Código Seguro
// BIEN: usa un validador de tiempo lineal o una librería segura
import isEmail from 'validator/lib/isEmail';
if (isEmail(userInput)) { /* ... */ }

Ejemplo Real

En 2016, una vulnerabilidad ReDoS en el regex de parseo de fechas de moment.js causó una interrupción de 28 minutos en Stack Overflow cuando se envió una fecha mal formada.

Cómo Prevenirlo

  • Prueba tus regex con herramientas como safe-regex o vuln-regex-detector antes de deployar
  • Evita cuantificadores anidados como (a+)+, (a*)* o alternativas con grupos que se solapan
  • Establece una longitud máxima de input antes de correr regex sobre datos de usuarios
  • Usa librerías de validación especializadas (validator.js, zod) en vez de regex hechos a mano para formatos comunes

Tecnologías Afectadas

Node.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas