
CVE-2026-40987 PoC
Este repositorio es un PoC mínimo para reproducir CVE-2026-40987, publicado en el aviso de seguridad oficial de 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:LEl sincronizador remoto de archivos de Spring Integration podía usar directamente el nombre de archivo proporcionado por el servidor remoto al crear la ruta de almacenamiento local. Si la validación de la ruta canónica no era suficiente, un servidor FTP/SFTP/SMB malicioso o comprometido podía devolver un nombre de archivo como ../escaped-by-ftp-list.txt para escribir archivos fuera del localDirectory configurado.
Según el aviso oficial, no se trata solo de un problema de FTP, sino que afecta a la familia de sincronizadores remotos de archivos FTP/SFTP/SMB de Spring Integration. Este PoC utiliza FtpInboundFileSynchronizer para reproducir la misma ruta de vulnerabilidad de la manera más pequeña y clara.
Productos afectados según el aviso oficial:
Versiones afectadas:
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.20Versiones corregidas:
7.0.5 o 7.0.4.16.5.9 o 6.5.8.16.4.126.3.155.5.21Las pruebas muestran dos rutas.
SpringIntegrationRemoteFilePathTraversalTest
../escaped-by-spring-integration.txt, se crea una ruta de archivo fuera del directorio local configurado.SpringIntegrationFtpPathTraversalTest
../escaped-by-ftp-list.txt en la respuesta LIST del servidor FTP.FtpInboundFileSynchronizer real de Spring Integration recibe este nombre de archivo, descarga incoming/../escaped-by-ftp-list.txt, y el archivo resultante se crea fuera del directorio downloads.El flujo central del PoC es el siguiente:
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
Es decir, se puede escribir archivos fuera del directorio de descarga previsto por la aplicación.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Resultado esperado con versiones vulnerables:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
El éxito de la prueba significa que "se ha reproducido el comportamiento vulnerable". Es decir, con dependencias vulnerables, la prueba pasa y demuestra la escritura fuera del directorio.
Se pueden verificar varias versiones vulnerables con los siguientes comandos:
.\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
El valor predeterminado de este repositorio es spring-integration.version=7.0.4.
Esta vulnerabilidad permite a un atacante escribir contenido controlado por el atacante en el sistema de archivos local de la aplicación cliente. El atacante no es un cliente HTTP típico, sino que debe poder manipular las respuestas de un servidor de archivos remoto en el que la aplicación confía y al que consulta periódicamente.
Por lo tanto, existen condiciones previas, pero si se cumplen, son posibles los siguientes impactos:
El aviso oficial evaluó este problema como High.
El aviso oficial de Spring indica que los siguientes investigadores lo reportaron de manera responsable: