Denegación de servicio mediante expresiones regulares (REDoS) en UAParser.js
26 de octubre de 2020
0 minutos de lecturaTe damos la bienvenida al Perfil mensual de vulnerabilidades de Snyk. En esta serie, Snyk repasa las vulnerabilidades descubiertas por nuestroEquipo de investigación de seguridado reportadas a él. Elegimos una vulnerabilidad destacada del mes anterior y contamos la historia detrás de su descubrimiento, investigación y divulgación. Destacamos a los investigadores, desarrolladores y usuarios que ayudan a identificar y corregir vulnerabilidades en la comunidad de código abierto.
Este mes analizamos una vulnerabilidad de denegación de servicio mediante expresiones regulares (REDoS) descubierta en el popular paquete de JavaScript UAParser.
Vulnerabilidad:ejecución de código arbitrario en ua-parser-jsCVE asignados: CVE-2020-7733Analista de Snyk:Asaf BitonDescubierta por:Yeting Li
El equipo de investigación de Snyk investigó y divulgó una vulnerabilidad de denegación de servicio mediante expresiones regulares (REDoS) en el popular paquete de JavaScript UAParser, que nos reportó un investigador externo.
Como parte de sus esfuerzos por facilitar y hacer más eficaz la divulgación de vulnerabilidades para los investigadores, el equipo trabaja con quienes nos reportan vulnerabilidades. Cada reporte se investiga para determinar si el problema se puede reproducir, si realmente representa un riesgo de seguridad en el contexto del paquete y, en última instancia, para comprender a fondo el riesgo que la vulnerabilidad podría representar para la comunidad de código abierto.
Un investigador externo, Yeting Li, reportó a Snyk la vulnerabilidad REDoS en el paquete UAParser. Analicemos en detalle la vulnerabilidad, cómo se descubrió y cómo el equipo de investigación colaboró con el investigador y el responsable del paquete para garantizar que la vulnerabilidad se divulgara de forma responsable y, finalmente, se corrigiera.
Un análisis detallado de la vulnerabilidad REDoS
UAParser es un paquete de JavaScript para analizar agentes de usuario, diseñado para usarse tanto en el cliente como en el servidor. Según Snyk Advisor, el paquete UAParser tiene más de seis millones, lo que lo convierte en un paquete muy popular. La vulnerabilidad REDoS descubierta y divulgada en este caso se encontraba en las expresiones regulares definidas para identificar navegadores en teléfonos Xiaomi Redmi y tabletas Mi Pad.
En su prueba de concepto, Li demostró que, al agregar una cadena larga de espacios (en su caso, 5000) seguida de un signo de exclamación al agente de usuario, un atacante podía provocar una condición llamada retroceso catastrófico. Esta condición puede hacer que las pruebas de una cadena con una expresión regular tarden mucho más de lo normal, consuman recursos o incluso provoquen el bloqueo total del motor de expresiones regulares. Si se ataca el procesamiento de expresiones regulares en una aplicación Node.js del lado del servidor, esto puede hacer que el servidor falle o deje de responder a otras solicitudes de usuarios. A continuación puedes ver la prueba de concepto completa:
Para obtener más información sobre las vulnerabilidades REDoS, cómo ocurre el retroceso catastrófico y cómo se puede explotar, consulta nuestra publicación del blog aquí.
Investigación de las vulnerabilidades REDoS
Yeting Li es estudiante de posgrado e investigador en el Laboratorio de Ciencias de la Computación del Instituto de Software de la Academia China de Ciencias (ISCAS). Como parte de su investigación actual para obtener su doctorado, se ha enfocado en técnicas para automatizar la detección de vulnerabilidades en expresiones regulares que son susceptibles a ataques REDoS. En el marco de esta investigación, creó un algoritmo que utiliza para buscar estas vulnerabilidades en paquetes de código abierto.
El equipo de investigación de Snyk ha colaborado con el Sr. Li en numerosas divulgaciones durante el último año. Tanto el investigador como el equipo de Snyk han trabajado juntos para que el proceso sea lo más eficiente posible. Snyk colaboró con el Sr. Li para establecer expectativas claras que guiara la elaboración de sus divulgaciones y permitiera procesarlas rápidamente. Desde la perspectiva de Snyk, recibir un volumen tan alto de divulgaciones de un solo investigador fue una situación excepcional. Para facilitar el trabajo de ambas partes, se creó un repositorio privado de GitHub que permitiera intercambiar información fácilmente.
El 9 de septiembre de 2020, el Sr. Li subió su reporte y la prueba de concepto de una vulnerabilidad REDoS que había descubierto en el paquete UAParser. Asaf Biton, del equipo de investigación de Snyk, quedó a cargo de la investigación. Asaf pudo utilizar la prueba de concepto proporcionada, con algunas modificaciones rápidas, para verificar que la vulnerabilidad se podía reproducir y representaba un riesgo en el contexto del paquete. En menos de una hora, Asaf había enviado un correo electrónico al responsable del paquete para notificarle la vulnerabilidad y pedirle permiso para reservar un CVE.
El responsable respondió en menos de 24 horas e indicó que publicaría una corrección en los próximos días y que se podía publicar un CVE una vez que la corrección estuviera disponible. El 12 de septiembre, menos de 72 horas después de la divulgación inicial, el responsable del paquete confirmó una corrección en el repositorio de GitHub y notificó a Snyk que la nueva versión estaba disponible. A su vez, Snyk publicó CVE-2020-7733 en la base de datos de CVE y el informe completo en Snyk Vulnerability Database con el ID de Snyk SNYK-JS-UAPARSERJS-610226.

En retrospectiva
Tras la publicación de la vulnerabilidad en la base de datos de Snyk, se descubrió que casi 21 000 paquetes monitoreados por Snyk tenían versiones vulnerables. Gracias al esfuerzo conjunto de este investigador, el responsable del paquete y el equipo de investigación de Snyk, los desarrolladores responsables de esos paquetes en el sistema de Snyk, junto con muchos otros que aún no son usuarios del ecosistema de Snyk, pudieron recibir una notificación sobre el problema y corregirlo fácilmente en su código.
Este es otro excelente ejemplo de cómo el compromiso de Snyk con permitir que los desarrolladores usen software de código abierto de forma segura va más allá de los límites de la herramienta de Snyk. Nuestro equipo de investigación sigue trabajando para identificar y divulgar vulnerabilidades, tanto mediante sus propias investigaciones como en colaboración con otros investigadores de las comunidades de seguridad y de código abierto.
Empieza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.
