ReDoS, o Regular Expression Denial of Service, es una vulnerabilidad de seguridad que surge cuando una expresión regular (regex) mal construida o ineficiente se enfrenta a una cadena de entrada específicamente diseñada para explotar su complejidad algorítmica. Algunos patrones de regex, particularmente aquellos con cuantificadores anidados o alternancias que pueden coincidir con la misma subcadena de múltiples maneras (backtracking exponencial), pueden llevar a un tiempo de procesamiento que crece exponencialmente con la longitud de la entrada. Un atacante puede enviar una cadena de entrada que, aunque no coincida con la regex, fuerza al motor a explorar un número prohibitivo de caminos de coincidencia, consumiendo CPU y memoria hasta el punto de causar una denegación de servicio para la aplicación o el sistema.
Las vulnerabilidades ReDoS pueden manifestarse en una amplia gama de sistemas y herramientas que utilizan expresiones regulares para validación de entrada, búsqueda, reemplazo o análisis léxico. Ejemplos concretos incluyen aplicaciones web que validan direcciones de correo electrónico, URLs o formatos de datos JSON/XML usando regex en lenguajes como JavaScript (Node.js), Python, Ruby, Java o PHP. Herramientas de infraestructura como proxies inversos (ej., Nginx con módulos de reescritura de URL), firewalls de aplicaciones web (WAFs) o sistemas de detección de intrusiones (IDS) que dependen de regex para el filtrado de tráfico o la detección de patrones maliciosos también son susceptibles. Incluso herramientas de desarrollo como linters o analizadores de código pueden ser explotadas si sus regex internas son vulnerables.
Para un arquitecto de sistemas, comprender ReDoS es crucial para diseñar sistemas robustos y seguros. Implica tomar decisiones de diseño sobre la validación de entrada, favoreciendo librerías de validación bien probadas o algoritmos de parsing de estado finito sobre regex complejas cuando sea posible. Es fundamental realizar análisis de seguridad estáticos (SAST) y dinámicos (DAST) para identificar regex vulnerables y probar su rendimiento bajo carga con entradas maliciosas. Los arquitectos deben considerar la implementación de límites de tiempo de ejecución para el procesamiento de regex, aislar los componentes que manejan regex en entornos de baja confianza o con recursos limitados, y educar a los equipos de desarrollo sobre las mejores prácticas para escribir expresiones regulares eficientes y seguras. El trade-off principal es entre la flexibilidad y concisión de las regex complejas y la seguridad y estabilidad del sistema.