
Análisis en profundidad de CVE-2024-38819, una vulnerabilidad de recorrido de archivos en Spring WebFlux, con desglose a nivel de código, PoC y estrategias de mitigación que incluyen filtros y reglas IPS.
La vulnerabilidad de File-Traversal (también conocida como Path Traversal) es un tipo de ataque designado como CWE-22 que permite a un atacante eludir los permisos del sistema de archivos en una aplicación web y acceder a archivos arbitrarios.
Spring WebFlux es un módulo introducido en Spring 5 que ofrece soporte para programación reactiva y permite el desarrollo de aplicaciones asíncronas no bloqueantes. WebFlux.fn proporciona enrutamiento de endpoints funcionales, lo que permite una configuración de rutas concisa y flexible mediante expresiones lambda.
CVE-2024-38819 se produce en aplicaciones que utilizan WebFlux.fn y WebMVC.fn. Este documento examina el flujo de código de cómo se produce esta vulnerabilidad en el contexto de WebFlux y busca plantear medidas de mitigación al respecto.
[Figura 1] FileApplication.java
En [Figura 1], Spring WebFlux busca todas las solicitudes que llegan a /static/** en el directorio C:/file del servidor y las sirve. Aquí,
[Figura 2] PathResourceLookupFunction.class - apply
[Figura 2] PathResourceLookupFunction - apply verifica si la ruta dada apunta a un recurso válido en Spring WebFlux y devuelve dicho recurso
[Figura 3] PathResourceLookupFunction.class - isInvalidPath
En [Figura 3], PathResourceLookupFunction - isInvalidPath contiene la condición StringUtils.cleanPath(path).contains("../"),
[Figura 4] StringUtils.class - cleanPath
En [Figura 4], StringUtils.class - cleanPath, StringUtils.cleanPath(path) elimina TOP_PATH(".."), coloca la ruta en pathElements y top pasa a ser 0; por lo tanto,
[Figura 5] PathResourceLookupFunction.class - apply - 2
[Figura 6] PathResourceLookupFunction.class - isResourceUnderLocation
Mediante la llamada a cleanPath en isResourceUnderLocation de [Figura 5], se realiza una verificación adicional de cleanPath, como se muestra en [Figura 6]; la ruta pasada desde [Figura 5] es C:/file../Windows/System32/drivers/etc/hosts, y
[Figura 7] StringUtils.class - cleanPath -2
Con el código de [Figura 7], el prefijo se convierte en C:/ y la ruta se modifica a /Windows/System32/drivers/etc/hosts mediante [Figura 4]; el retorno finalActualmente la prueba se realizó en Windows con C:/file, pero este caso resulta muy peligroso si se combina con un enlace simbólico en Linux.
(Con "../../" (dos veces) se aplica la lógica normal; la vulnerabilidad solo ocurre con "../" (una vez))

Ataque combinado con un enlace simbólico en un servidor Linux
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
Agregar el enlace simbólico con ln -s /static /app/static/link y luego atacar

Hasta ahora hemos revisado el flujo en el que se ejecuta el File Traversal (CVE-2024-38819) en el entorno Spring WebFlux. Dado que es un ataque que permite el robo de información del servidor, las medidas de mitigación son importantes. Para ello, se propone la actualización a la última versión, la creación de lógica de verificación adicional y el bloqueo mediante IPS.