downloadToFile 路径遍历针对同一 Apache Camel 漏洞的可运行概念验证复现程序,每个运行时一个:
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| 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(打包了 Camel 4.20.0) |
两者均为受影响版本(该问题已在 4.14.9 / 4.18.4 / 4.22.0 中修复),并且都证明了完全相同的缺陷:camel-azure-storage-datalake 组件可以通过其 downloadToFile 操作将一个 ADLS Gen2 文件下载到本地文件系统,写入由 fileDir 选项指定的目录中。
DataLakeFileOperations.downloadToFile 通过将 fileDir 与 Azure SDK 报告的确切远程路径名拼接到一起来构建本地目标(new File(fileDir, fileClientWrapper.getFileName()))——没有任何词法规范化,也没有检查解析后的位置是否保持在 fileDir 内。远程名称不受路由控制:消费者枚举文件系统(DataLakeConsumer.createBatchExchangesFromPath)并下载每个条目。因此,包含 ../ 段的路径名会解析到 fileDir 之外(CWE-22,路径遍历 → 任意文件写入)。
关于测试工具的说明。 任何可用的本地模拟器都没有实现 Azure Data Lake Gen2 API —— Azurite 对 Gen2
listPaths和文件操作返回 HTTP 400。因此,这些复现程序直接驱动确切易受攻击的代码(DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())),提供一个 Data Lake 文件客户端包装器,其getFileName()返回远程名称——与消费者从PathItem.getName()读取名称并传入的方式完全相同。同类组件camel-azure-storage-blob共享相同的修复(CVE-2026-66906),而相同的缺陷在该组件中则针对正在运行的 Azurite 模拟器进行了端到端复现。
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
受影响构建(两种变体)的预期输出:
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
公告:https://camel.apache.org/security/CVE-2026-60093.html
消费者现在会将下载目标解析并限制在配置的 fileDir 目录内(通过 AzureFileNameHelper.resolveWithinDirectory),拒绝会导致其逃逸的路径名——这与覆盖 camel-azure-storage-blob(CVE-2026-66906)的修复相同。
本仓库发布用于教育和防御目的:帮助 Apache Camel 用户了解该漏洞、确认自己是否受影响,并验证升级是否解决问题。写入的文件是 /tmp 下一个无害的标记。请勿将本材料用于针对你不拥有或运营的系统。
| 属性 | 值 |
|---|
| 组件 | camel-azure-storage-datalake(Spring Boot:camel-azure-storage-datalake-starter;Quarkus:camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22(路径名到受限目录的限制不当——路径遍历) |
| 攻击向量 | 一个路径名包含 ../ 段的 Gen2 文件,由设置了 fileDir 的消费者下载 |
| 影响 | 在配置的 fileDir 目录之外进行任意文件写入 |
| 受影响版本 | 4.0.0 至 4.14.9 之前,4.15.0 至 4.18.4 之前,4.19.0 至 4.22.0 之前 |
| 修复版本 | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23942 |
| 致谢 | n0mi1k; Hiep Nguyen |