
Reprodutores de prova de conceito para path traversal do Apache Camel camel-google-storage (CVE-2026-66907), demonstrando escrita arbitrária de arquivos via downloadFileName, com detalhes das versões afetadas e corrigidas.
downloadFileName do camel-google-storageReprodutores de prova de conceito executáveis para a mesma vulnerabilidade do Apache Camel, um por runtime:
| Runtime | Directory | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-google-storage 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (inclui o Camel 4.20.0) |
Ambas são versões afetadas (o problema é corrigido nas versões 4.14.9 / 4.18.4 / 4.22.0), e ambas demonstram o mesmo defeito: o consumidor do camel-google-storage baixa objetos do bucket para o sistema de arquivos local quando downloadFileName é um diretório, construindo o destino local anexando o nome do objeto remoto a ele (downloadFileName + "/${file:name}"). O token ${file:name} retorna o nome do objeto literalmente (ao contrário de ${file:onlyname}, que remove o caminho), e o resultado era passado para new File(result) / blob.downloadTo(file.toPath()) sem normalização e sem verificação de que o destino permanecia dentro do diretório configurado. O nome do objeto não é controlado pela rota — o consumidor lista o bucket e baixa todos os objetos — portanto, um objeto cujo nome contenha segmentos ../ é gravado fora de downloadFileName (CWE-22, travessia de caminho → gravação arbitrária de arquivo).
Cada subdiretório é autocontido (com seu próprio Dockerfile, docker-compose.yml que sobe um emulador fake-gcs-server e README). Em resumo, para qualquer um dos dois:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Saída esperada em uma build afetada (ambas as variantes):
Files inside the intended download directory /app/downloads:
- report.txt
File written OUTSIDE it, at /tmp/pwned-66907.txt: true
content: PWNED via path traversal — CVE-2026-66907
>>> PROVEN: the object name's ../ segments escaped the configured downloadFileName directory ... : true
| Propriedade | Valor |
|---|---|
| Componente | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (Limitação Incorreta de um Nome de Caminho a um Diretório Restrito — Travessia de Caminho) |
| Vetor de ataque | Um objeto do bucket cujo nome contém segmentos ../, baixado pelo consumidor com downloadFileName definido como um diretório |
| Impacto | Gravação arbitrária de arquivo fora do diretório de download configurado |
| Versões afetadas | De 4.0.0 até antes de 4.14.9, de 4.15.0 até antes de 4.18.4, de 4.19.0 até antes de 4.22.0 |
| Versões corrigidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24279 |
| Crédito | n0mi1k |
O consumidor agora normaliza o caminho resolvido e garante que ele permaneça dentro do diretório downloadFileName configurado (via GoogleCloudStorageFileNameHelper.assertWithinDirectory), rejeitando nomes de objeto que escapariam dele.
O docker-compose.yml executa o fake-gcs-server com -backend memory. Os nomes de objeto são então mantidos como chaves opacas de mapa, portanto um nome contendo ../ é preservado; o backend de sistema de arquivos padrão resolveria o ../ e o objeto não seria listável.
Este repositório é publicado para fins educacionais e defensivos: ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O arquivo gravado é um marcador benigno em /tmp. Não use este material contra sistemas que você não possui ou opera.