
Reprodutores de prova de conceito da vulnerabilidade de path traversal no Apache Camel (CVE-2026-60093) no camel-azure-storage-datalake, demonstrando escrita arbitrária de arquivos via downloadToFile.
downloadToFile do camel-azure-storage-datalake com path traversalReprodutores de prova de conceito executáveis para a mesma vulnerabilidade do Apache Camel, um por runtime:
| Runtime | Diretório | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (inclui Camel 4.20.0) |
Ambos são versões afetadas (o problema é corrigido em 4.14.9 / 4.18.4 / 4.22.0), e ambos demonstram o mesmo
defeito: o componente camel-azure-storage-datalake pode baixar um arquivo ADLS Gen2 para o sistema de arquivos local
por meio da operação downloadToFile, gravando no diretório nomeado pela opção fileDir.
DataLakeFileOperations.downloadToFile construía o destino local unindo fileDir ao nome do caminho remoto
exatamente como o SDK do Azure o reportava (new File(fileDir, fileClientWrapper.getFileName())) — sem
normalização lexical e sem verificação de que o local resolvido permanecia dentro de fileDir. O nome remoto não é
controlado pela rota: o consumidor enumera o sistema de arquivos (DataLakeConsumer.createBatchExchangesFromPath) e
baixa todas as entradas. Um nome de caminho contendo segmentos ../ portanto resolve fora de fileDir (CWE-22,
path traversal → gravação arbitrária de arquivos).
Nota sobre o harness de teste. A API Data Lake Gen2 do Azure não é implementada por nenhum emulador local disponível — o Azurite retorna HTTP 400 para
listPathsdo Gen2 e para operações de arquivo. Estes reprodutores portanto acionam o código vulnerável exato (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())) diretamente, fornecendo um wrapper de cliente de arquivo do Data Lake cujogetFileName()retorna o nome remoto — exatamente como o consumidor fornece o nome que leu dePathItem.getName(). O componente irmãocamel-azure-storage-blobcompartilha a mesma correção (CVE-2026-66906) e lá o defeito idêntico é reproduzido de ponta a ponta contra um emulador Azurite ativo.
cd camel-spring-boot # ou: 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):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
| Propriedade | Valor |
|---|---|
| Componente | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (Limitação Incorreta de um Nome de Caminho a um Diretório Restrito — Path Traversal) |
| Vetor de ataque | Um arquivo Gen2 cujo nome de caminho contém segmentos ../, baixado pelo consumidor com fileDir definido |
| Impacto | Gravação arbitrária de arquivos fora do diretório fileDir configurado |
| Versões afetadas | De 4.0.0 antes de 4.14.9, de 4.15.0 antes de 4.18.4, de 4.19.0 antes de 4.22.0 |
| Versões corrigidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23942 |
| Crédito | n0mi1k; Hiep Nguyen |
O consumidor agora resolve e restringe o destino do download ao diretório fileDir configurado (via
AzureFileNameHelper.resolveWithinDirectory), rejeitando nomes de caminho que sairiam dele — a mesma correção que cobre
camel-azure-storage-blob (CVE-2026-66906).
Este repositório é publicado para fins educacionais e defensivos: para ajudar 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.