
Análise aprofundada de CVE-2024-38819, uma vulnerabilidade de travessia de arquivo Spring WebFlux, com detalhamento em nível de código, PoC e estratégias de mitigação incluindo filtros e regras de IPS.
A vulnerabilidade File-Traversal (navegação de caminho, Path Traversal) é uma vulnerabilidade que permite a um atacante contornar as permissões do sistema de arquivos em uma aplicação web e acessar arquivos arbitrários, sendo um tipo de ataque designado como CWE-22.
O Spring WebFlux é um módulo introduzido no Spring 5 que oferece suporte à programação reativa, permitindo o desenvolvimento de aplicações assíncronas não bloqueantes. O WebFlux.fn fornece roteamento de endpoints funcional, suportando uma configuração de roteamento concisa e flexível por meio de expressões lambda.
A CVE-2024-38819 ocorre em aplicações que utilizam WebFlux.fn e WebMVC.fn. Este documento examina o fluxo de código de como essa vulnerabilidade ocorre no contexto do WebFlux e busca explorar medidas de mitigação correspondentes.
[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
Atualmente, o teste foi realizado no Windows com C:/file, mas esse caso é muito perigoso quando combinado com um link simbólico no Linux.
(Quando configurado com ../../ duas vezes, é uma lógica normal; a vulnerabilidade ocorre somente quando há um único ../)

Ataque com link simbólico no servidor Linux
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
Após adicionar o link simbólico ln -s /static /app/static/link, realizar o ataque

Até agora, verificamos o fluxo em que o File Traversal (CVE-2024-38819) é executado no ambiente Spring WebFlux. Por ser um método de ataque que rouba as informações do servidor,
as medidas de mitigação são importantes. Para isso, propomos a atualização para a versão mais recente, a criação de lógica adicional de verificação e o bloqueio por meio de 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 as requisições de URL que causam a navegação para o caminho superior (../)
Até agora, examinamos o File Traversal por meio do WebFlux. Essa vulnerabilidade foi um caso em que o problema decorrente da lógica de StringUtils.cleanPath() não foi reconhecido antes da utilização.
(POC)
https://github.com/masa42/CVE-2024-38819-POC
(Site oficial do 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