
CVE-2026-40987 PoC
Este repositório é um PoC mínimo de reprodução do
CVE-2026-40987, divulgado pelo comunicado oficial de segurança do 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:LO sincronizador remoto de arquivos do Spring Integration podia usar o nome de arquivo fornecido pelo servidor remoto diretamente ao criar o caminho de armazenamento local. Se a validação do caminho canônico não fosse suficiente, um servidor FTP/SFTP/SMB malicioso ou comprometido poderia retornar um nome de arquivo como ../escaped-by-ftp-list.txt, fazendo com que o arquivo fosse escrito fora do localDirectory configurado.
De acordo com o comunicado oficial, não é um problema apenas do FTP, mas sim de toda a família de sincronizadores remotos de arquivos FTP/SFTP/SMB do Spring Integration. Este PoC utiliza o FtpInboundFileSynchronizer para reproduzir o mesmo vetor de vulnerabilidade da forma mais pequena e clara possível.
Produtos afetados conforme comunicado oficial:
Versões afetadas:
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.20Versões corrigidas:
7.0.5 ou 7.0.4.16.5.9 ou 6.5.8.16.4.126.3.155.5.21Os testes demonstram dois caminhos.
SpringIntegrationRemoteFilePathTraversalTest
../escaped-by-spring-integration.txt, o caminho do arquivo é criado fora do diretório local configurado.SpringIntegrationFtpPathTraversalTest
../escaped-by-ftp-list.txt na resposta LIST do servidor FTP.FtpInboundFileSynchronizer real do Spring Integration recebe este nome de arquivo, baixa incoming/../escaped-by-ftp-list.txt, e verifica que o arquivo resultante é criado fora do diretório downloads.O fluxo central do PoC é o seguinte:
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
Ou seja, é possível escrever arquivos fora do diretório de download pretendido pela aplicação.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
Resultado esperado em versões vulneráveis:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
O sucesso do teste significa que "o comportamento vulnerável foi reproduzido". Ou seja, com dependências vulneráveis, o teste passa, demonstrando a escrita de escape de diretório.
Você pode verificar várias versões vulneráveis com os seguintes 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
O padrão deste repositório é spring-integration.version=7.0.4.
Esta vulnerabilidade permite que um atacante escreva conteúdo controlado pelo atacante no sistema de arquivos local da aplicação cliente. O atacante não é um cliente HTTP comum; ele precisa ser capaz de manipular as respostas de um servidor de arquivos remoto que a aplicação confia e consulta periodicamente.
Portanto, pré-condições existem, mas se as condições forem atendidas, os seguintes impactos são possíveis:
O comunicado oficial avaliou este problema como High.
O comunicado oficial do Spring lista os seguintes pesquisadores como tendo reportado responsavelmente: