
Глубокий анализ 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
[Рисунок 1] показывает, что в Spring WebFlux все запросы, поступающие на /static/**, обслуживаются из каталога C:/file на сервере. Здесь
[Рисунок 2] PathResourceLookupFunction.class - apply
[Рисунок 2] PathResourceLookupFunction - apply проверяет, указывает ли заданный путь на допустимый ресурс, и возвращает его в виде
[Рисунок 3] PathResourceLookupFunction.class - isInvalidPath
[Рисунок 3] PathResourceLookupFunction - isInvalidPath содержит условие StringUtils.cleanPath(path).contains("../").
[Рисунок 4] StringUtils.class - cleanPath
[Рисунок 4] StringUtils.class - cleanPath показывает, что StringUtils.cleanPath(path) удаляет TOP_PATH (".."), помещает путь в pathElements, и top становится равным 0,
[Рисунок 5] PathResourceLookupFunction.class - apply - 2
[Рисунок 6] PathResourceLookupFunction.class - isResourceUnderLocation
При вызове cleanPath в isResourceUnderLocation из [Рисунок 5] происходит ещё одна проверка через cleanPath, и путь, переданный в [Рисунок 5], имеет вид C:/file../Windows/System32/drivers/etc/hosts.
[Рисунок 7] StringUtils.class - cleanPath -2
С помощью кода из [Рисунок 7] префикс становится C:/, а путь, пройдя через [Рисунок 4], преобразуется в /Windows/System32/drivers/etc/hosts, и в итоге возвращаетсяВ данном случае тестирование проводилось на 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.