
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
[Figura 2] PathResourceLookupFunction.class - apply
[Figura 3] PathResourceLookupFunction.class - isInvalidPath
[Figura 4] StringUtils.class - cleanPath
[Figura 5] PathResourceLookupFunction.class - apply - 2
[Figura 6] PathResourceLookupFunction.class - isResourceUnderLocation
[Figura 7] StringUtils.class - cleanPath -2
Actualmente 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.
@Bean
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("C:/file"))
.filter((request, next) -> {
String path = request.path();
if (path.contains("..")) {
if(!StringUtils.cleanPath(path).contains("../")) {
return ServerResponse.status(HttpStatus.FORBIDDEN).bodyValue("Vuln path access.");
}
}
return next.handle(request);
});
}
Bloquear todas las solicitudes URL que provoquen el movimiento a rutas superiores mediante ../
Hemos analizado el File Traversal a través de WebFlux. Esta vulnerabilidad se presenta cuando se utiliza StringUtils.cleanPath() sin ser consciente del problema derivado de su lógica.
(POC)
https://github.com/masa42/CVE-2024-38819-POC
(Sitio oficial de Spring)
https://spring.io/security/cve-2024-38819
(CVE-DETAIL)
https://www.cvedetails.com/cve/CVE-2024-38819/
(NIST)
https://nvd.nist.gov/vuln/detail/cve-2024-38819