
Глубокий анализ CVE-2024-38819, уязвимости обхода файлов в Spring WebFlux, с разбором на уровне кода, PoC и стратегиями смягчения, включая фильтры и правила IPS.
Уязвимость File-Traversal (обход пути, Path Traversal) позволяет злоумышленнику обходить разрешения файловой системы веб-приложения и получать доступ к произвольным файлам; она классифицируется как CWE-22 и является одним из видов атак.
Spring WebFlux — это модуль, представленный в Spring 5 и поддерживающий реактивное программирование для разработки асинхронных неблокирующих приложений. WebFlux.fn обеспечивает функциональную маршрутизацию конечных точек, позволяя лаконично и гибко настраивать маршруты с помощью лямбда-выражений.
CVE-2024-38819 возникает в приложениях, использующих WebFlux.fn или WebMVC.fn; в данном документе мы рассмотрим, как эта уязвимость проявляется на примере WebFlux, проследим поток кода и предложим меры противодействия.
[Рисунок 1] FileApplication.java
[Рисунок 2] PathResourceLookupFunction.class - apply
[Рисунок 3] PathResourceLookupFunction.class - isInvalidPath
[Рисунок 4] StringUtils.class - cleanPath
[Рисунок 5] PathResourceLookupFunction.class - apply - 2
[Рисунок 6] PathResourceLookupFunction.class - isResourceUnderLocation
[Рисунок 7] StringUtils.class - cleanPath -2
В данном случае тестирование проводилось на Windows с каталогом C:/file, но этот сценарий очень опасен при работе на Linux с символическими ссылками.
(При двухкратном использовании ../ путь становится корректным; уязвимость возникает только при однократном ../)

Атака на сервере Linux с символической ссылкой
public RouterFunction<ServerResponse> staticResourceRouter() {
return RouterFunctions.resources("/static/**", new FileSystemResource("/app/static/"));
}
Добавление символической ссылки ln -s /static /app/static/link, затем атака

Мы рассмотрели поток выполнения File Traversal (CVE-2024-38819) в среде Spring Webflux. Поскольку это атака с целью кражи информации с сервера, меры реагирования очень важны. В связи с этим предлагаем обновление до последней версии, создание дополнительной логики проверки и блокировку с помощью 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);
});
}
Блокировка всех URL-запросов, вызывающих перемещение в родительский каталог ../
Мы рассмотрели File Traversal через Webflux. Эта уязвимость возникла из-за того, что не была замечена проблема в логике StringUtils.cleanPath().
(POC)
https://github.com/masa42/CVE-2024-38819-POC
(Официальный сайт 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