Mediante un análisis de seguridad exhaustivo llevado a cabo por el Red Team OPSWAT, los investigadores de seguridad Thai Do y Minh Pham identificaron varias vulnerabilidades que afectan al marco Rack Ruby, concretamente las CVE-2025-25184, CVE-2025-27111 y CVE-2025-27610.
Este artículo ofrece una descripción detallada de estas vulnerabilidades, prestando especial atención a la CVE-2025-27610. En él se analizan las causas fundamentales, se evalúan las posibles repercusiones y se describen estrategias de mitigación eficaces para proteger las aplicaciones que utilizan el marco Rack.
Descripción general del rack
Rack es una interfaz modular que conecta servidores web con aplicaciones web basadas en Ruby. Estandariza la interacción entre estos componentes al agrupar las solicitudes y respuestas HTTP en una sola llamada a un método, lo que simplifica el proceso de desarrollo y favorece la compatibilidad entre distintos marcos de trabajo y servidores.
Rack es utilizado por numerosos marcos web y bibliotecas de Ruby, como Ruby on Rails y Sinatra. Está disponible como una gema de Ruby. La amplia adopción de Rack a nivel mundial, con más de mil millones de descargas en todo el mundo, pone de relieve su papel fundamental dentro del ecosistema de desarrollo de Ruby. Los componentes de middleware como Rack::Static y Rack::Sendfile mejoran la eficiencia al gestionar la entrega de contenido estático y optimizar la transmisión de archivos. Debido a esta amplia integración, las vulnerabilidades descubiertas en Rack tienen importantes implicaciones de seguridad, que podrían afectar a numerosas aplicaciones y sistemas en todo el mundo.
Detección de vulnerabilidades de seguridad en Rack
Durante una reciente investigación de seguridad llevada a cabo sobre el marco de middleware Rack, OPSWAT Thai Do y Minh Pham identificaron varias vulnerabilidades que suponen riesgos de seguridad significativos para las aplicaciones web basadas en Ruby:
- CVE-2025-25184: Thai Do descubrió una vulnerabilidad que permite a los atacantes realizar inyecciones en los registros mediante caracteres CRLF (retorno de carro y avance de línea), lo que podría dar lugar a la manipulación de las entradas de los registros.
- CVE-2025-27111: Minh Pham descubrió una vulnerabilidad de seguridad que permite a los atacantes inyectar y manipular el contenido de los registros mediante valores de encabezado maliciosos.
- CVE-2025-27610: Minh Pham también identificó una vulnerabilidad de recorrido de ruta, que podría permitir a los atacantes obtener acceso no autorizado a archivos ubicados fuera del directorio de archivos estáticos designado, lo que supone una amenaza significativa para la seguridad.
Entre estas vulnerabilidades, la CVE-2025-27610 es especialmente grave, ya que podría permitir a atacantes no autenticados obtener información sensible, como archivos de configuración, credenciales y datos confidenciales, lo que daría lugar a filtraciones de datos. A esta vulnerabilidad se le ha asignado una puntuación CVSS de 7,5, lo que la clasifica como un riesgo de gravedad alta.

Vulnerabilidad en Rack::Static y la inclusión de archivos locales
Comprender Rack::Static
Rack::Static es un middleware esencial en las aplicaciones Rack que se utiliza principalmente para servir de forma eficiente archivos estáticos, como JavaScript, CSS e imágenes. Al aprovechar Rack::Static, los desarrolladores pueden integrar a la perfección la entrega de contenido estático en las aplicaciones Ruby sin necesidad de recurrir a una configuración adicional del servidor web.
Al configurar Rack::Static, destacan dos opciones fundamentales: :urls y :root. Comprender y utilizar correctamente estas opciones simplifica y agiliza considerablemente el proceso de servicio de archivos estáticos.
1. La opción :urls
La opción :urls especifica qué rutas URL debe gestionar la aplicación Rack como recursos estáticos. Se proporciona como una matriz de cadenas, cada una de las cuales representa un prefijo de ruta que activa el manejo de archivos estáticos.
Por ejemplo:

En esta configuración, las solicitudes dirigidas a /images, /css o /js son interceptadas y procesadas por Rack::Static. Cualquier archivo que coincida con estas rutas se servirá directamente desde el sistema de archivos.
2. La opción :root
La opción :root define el directorio base desde el que se servirán los archivos estáticos. Este directorio es relativo al directorio de trabajo actual de tu aplicación Rack.
Teniendo en cuenta el ejemplo anterior:

Cuando se realiza una solicitud a /assets/logo.png, Rack::Static intenta servir el archivo ubicado en public/assets/logo.png.
Ejemplo práctico
La implementación eficaz de Rack::Static mediante las opciones :urls y :root ofrece un método organizado y de alto rendimiento para servir contenido estático en aplicaciones web de Ruby:

En este caso, las solicitudes dirigidas a /assets/* y /favicon.ico serán gestionadas automáticamente por Rack::Static. Todos los archivos correspondientes deben encontrarse en los directorios public/assets y public/favicon.ico, respectivamente.
Detalles técnicos de CVE-2025-27610
Durante un exhaustivo análisis de seguridad de Rack::Static, Minh Pham descubrió una vulnerabilidad importante relacionada con un manejo incorrecto de la opción :root. Concretamente, cuando el parámetro :root no se define explícitamente, Rack establece por defecto este valor en el directorio de trabajo actual asignándole el valor de Dir.pwd, lo que lo designa implícitamente como el directorio raíz web de la aplicación Rack.
Cabe destacar que Rack::Static concatena directamente las rutas URL entrantes con el directorio :root especificado sin una validación o depuración suficientes. En consecuencia, si la opción :root no está definida o está mal configurada en relación con la opción :urls, un atacante no autenticado podría aprovechar esta vulnerabilidad mediante técnicas de recorrido de rutas para acceder a archivos confidenciales fuera del directorio web previsto.
En la siguiente sección se ofrece un análisis detallado del proceso de gestión de solicitudes de Rack::Static, en el que se ilustra claramente cómo se puede aprovechar esta vulnerabilidad.
Vulnerabilidad de recorrido de rutas e inclusión de archivos locales en Rack::Static
Para comprender mejor cómo procesa las solicitudes el middleware Rack::Static, Minh Pham llevó a cabo un análisis exhaustivo del código fuente de Rack. Durante la inicialización de la clase Rack::Static, observó que, si la opción :root no se define explícitamente, Rack::Static sirve por defecto los archivos del directorio de trabajo actual (Dir.pwd). Por lo tanto, omitir esta opción hace que el middleware utilice implícitamente el directorio desde el que se ejecuta la aplicación.


Tras la inicialización, se determinó que, cuando Rack::Static recibe una solicitud HTTP entrante, se invoca el método call.

Posteriormente, Rack::Static delega la operación de servicio de archivos a Rack::Files, que intenta localizar y servir el archivo basándose en la ruta de archivo construida a partir del directorio :root configurado y el PATH_INFO proporcionado por el usuario.

En primer lugar, al invocar los métodos can_serve(path) y overwrite_file_path(path), el middleware examina la variable env["PATH_INFO"] para determinar si la solicitud entrante coincide con alguno de los prefijos de URL configurados (por ejemplo, /static, /public).

Si se cumple la condición, Rack::Static construye la ruta del archivo combinando el directorio raíz configurado (:root) con el PATH_INFO proporcionado por el usuario. Esta construcción se lleva a cabo sin una normalización ni una depuración adecuadas de la ruta de entrada. Concretamente, el middleware concatena directamente el PATH_INFO de la solicitud entrante con el directorio especificado por la opción :root, lo que da lugar a una vulnerabilidad debido a una validación insuficiente de la ruta proporcionada

Minh Pham descubrió que, debido a la falta de una desinfección o validación adecuadas en este flujo de trabajo, si el valor de PATH_INFO proporcionado por el usuario contiene secuencias de recorrido de directorios y la opción :root no se define explícitamente, la ruta de archivo resultante podría apuntar a una ubicación fuera del directorio raíz previsto, lo que podría dejar al descubierto archivos confidenciales.
CVE-2025-27610: Prueba de concepto
Para demostrar esta vulnerabilidad en Rack::Static, hemos desarrollado una aplicación web basada en Ruby que utiliza la versión 3.1.10 de Rack. En los casos en que la aplicación no defina explícitamente la opción :root, un atacante no autenticado puede aprovechar esta vulnerabilidad para acceder a datos confidenciales, como credenciales, archivos de configuración o archivos de bases de datos, lo que podría dar lugar a una fuga de datos de gran envergadura.
Consulte el siguiente vídeo para ver una demostración detallada del grave impacto que conlleva esta vulnerabilidad:
Medidas de mitigación y orientación
Para mitigar las vulnerabilidades que hemos comentado anteriormente, asegúrese de que su sistema esté actualizado a la última versión de Rack.
MetaDefender Core su motor SBOM, puede detectar esta vulnerabilidad.
OPSWAT MetaDefender Core, equipado con capacidades avanzadas de SBOM (Software de materialesSoftware ), permite a las organizaciones adoptar un enfoque proactivo a la hora de abordar los riesgos de seguridad. Al analizar las aplicaciones de software y sus dependencias, MetaDefender Core vulnerabilidades conocidas, como CVE-2025-27610, CVE-2025-27111 y CVE-2025-25184, dentro de los componentes enumerados. Esto permite a los equipos de desarrollo y seguridad priorizar las tareas de aplicación de parches, mitigando los posibles riesgos de seguridad antes de que puedan ser explotados por actores maliciosos.
A continuación se muestra una captura de pantalla de CVE-2025-27610, CVE-2025-27111 y CVE-2025-25184, que fueron detectadas por MetaDefender Core SBOM:

