
CVE-2026-40987 PoC
Этот репозиторий содержит минимальный PoC для CVE-2026-40987, опубликованного в официальном бюллетене безопасности Spring.
Remote-file synchronizer in Spring Integration writes server-supplied filename under localDirectory without canonicalizationAV:N/AC:H/PR:L/UI:R/S:C/C:L/I:H/A:LСинхронизатор удаленных файлов (remote-file synchronizer) в Spring Integration мог использовать имя файла, предоставленное удаленным сервером, как есть при формировании пути локального хранения. Если проверка канонического пути была недостаточной, вредоносный или скомпрометированный FTP/SFTP/SMB сервер мог вернуть имя файла, например ../escaped-by-ftp-list.txt, что позволяло записать файл за пределами настроенного localDirectory.
Согласно официальному бюллетеню, это проблема не только FTP, а относится к семейству синхронизаторов удаленных файлов FTP/SFTP/SMB в Spring Integration. Данный PoC использует для наиболее компактной и наглядной демонстрации того же уязвимого пути.
FtpInboundFileSynchronizerЗатрагиваемые продукты согласно официальному бюллетеню:
Затрагиваемые версии:
7.0.0 - 7.0.46.5.0 - 6.5.86.4.0 - 6.4.116.3.0 - 6.3.145.5.0 - 5.5.20Исправленные версии:
7.0.5 или 7.0.4.16.5.9 или 6.5.8.16.4.126.3.155.5.21Тест показывает два пути.
SpringIntegrationRemoteFilePathTraversalTest
../escaped-by-spring-integration.txt.SpringIntegrationFtpPathTraversalTest
LIST FTP-сервера содержится ../escaped-by-ftp-list.txt.FtpInboundFileSynchronizer из Spring Integration загружает этот файл как incoming/../escaped-by-ftp-list.txt и что итоговый файл создается за пределами каталога downloads.Ключевой поток PoC выглядит следующим образом.
configured localDirectory = <temp>/downloads
remote LIST filename = ../escaped-by-ftp-list.txt
resulting local path = <temp>/downloads/../escaped-by-ftp-list.txt
normalized location = <temp>/escaped-by-ftp-list.txt
То есть можно записать файл за пределами целевого каталога загрузки приложения.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Ожидаемый результат для уязвимых версий:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Успешное прохождение теста означает, что уязвимое поведение воспроизведено. То есть при уязвимых зависимостях тест проходит, демонстрируя запись за пределы каталога.
Вы можете проверить несколько уязвимых версий с помощью следующих команд:
.\mvnw.cmd "-Dspring-integration.version=6.4.10" test
.\mvnw.cmd "-Dspring-integration.version=6.5.8" test
.\mvnw.cmd "-Dspring-integration.version=7.0.4" test
.\mvnw.cmd "-Dspring-integration.version=7.1.0-RC1" test
Значение по умолчанию в этом репозитории — spring-integration.version=7.0.4.
Эта уязвимость позволяет злоумышленнику записывать подконтрольное ему содержимое в локальную файловую систему клиентского приложения. Злоумышленник должен быть не обычным HTTP-клиентом, а иметь возможность манипулировать ответами удаленного файлового сервера, которому приложение доверяет и который опрашивает.
Таким образом, существуют предварительные условия, но при их соблюдении возможны следующие последствия:
Официальный бюллетень оценивает эту проблему как High.
В официальном бюллетене Spring указано, что следующие исследователи ответственно сообщили об этой проблеме: