针对 Apache Camel 漏洞的可运行概念验证复现程序。在该漏洞中,mina-sftp 消费者——与其他远程文件消费者一样派生自同一个 RemoteFileConsumer 基类——通过将配置的目录与服务器目录列表中报告的名称拼接,来构建每个轮询文件的绝对远程路径,且不做词法规范化,也不做包含性校验。该路径随后成为检索操作的操作数(始终如此),并在配置了 delete=true、move、preMove、moveFailed 或 readLock=rename 时,成为删除或重命名操作的操作数。
SFTP 目录条目名称是由服务器提供的原始协议字符串,因此被攻陷的、恶意的或多租户的服务器可以报告一个并非单一路径段的名称。
这是 CVE-2026-79983(
camel-ftp)的mina-sftp同类漏洞;两者 具有相同的根本原因和相同的修复方案。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0(Camel 4.22.0,受影响;修复对照版本 3.40.0 / Camel 4.22.1) |
camel-mina-sftp是在 Camel 4.18.0 中引入的,因此该组件并不存在于最新编号的 Camel Quarkus 所捆绑的 Camel 4.15.0 中;本复现程序使用 Camel Quarkus 3.39.0(Camel 4.22.0,受影响),并以 3.40.0(Camel 4.22.1)作为已修补的对照版本。因此,两个模块既演示了受影响的行为,也演示了 修复后的行为。
该应用内嵌了一个故意构造的恶意 SFTP 服务器(Apache MINA SSHD)。它提供一个真实的临时目录树,但在其 SSH_FXP_READDIR 回复中,将轮询目录 /upload 中某个文件的名称改写为路径穿越字符串 d/../../outside.txt(通过覆盖 getShortName 实现)。该名称不以点开头,因此 Camel 的隐藏文件规则不会拦截它,而 /upload + d/../../outside.txt 会解析为 /outside.txt,即轮询目录的上一级。一个普通的 mina-sftp 消费者轮询 /upload。
normal.txt 和逃逸的 /outside.txt。normal.txt 并跳过逃逸条目,同时记录日志
Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
受影响构建上的预期输出:
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
name=[normal.txt] (inside)
| 属性 | 值 |
|---|---|
| 组件 | camel-mina-sftp(mina-sftp scheme) |
| CWE | CWE-22(对路径名的限制不恰当导致受限目录访问) |
| 严重性 | 高 |
| 攻击向量 | 一个不是单一路径段的 READDIR 条目名称(由服务器提供) |
| 影响 | 读取——以及在使用 delete/move/readLock=rename 时,删除或重命名——轮询目录之外的文件,使用端点的凭据 |
| 受影响版本 | 从 4.18.0 到 4.18.5 之前,从 4.19.0 到 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24487 |
| 致谢 | 来自上海交通大学 NSSL 的 Dilrevx |
公告:https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory(由 RemoteFileConsumer 重写,mina-sftp 消费者派生自后者)会压缩解析后的路径,并在路径段边界上验证其保持在轮询目录内;解析到目录之外的条目会被跳过并发出警告,而合法条目仍会继续处理。
验证服务器主机密钥,使用 filter/antInclude/include 约束消费者仅接受单段名称,并避免对列表不完全可信的服务器使用 delete/move/preMove/moveFailed/readLock=rename。在可能的情况下,将服务器账户限制在轮询目录内。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自己是否受影响,并确认升级可以解决该问题。恶意服务器和“secret”均为无实际危害的本地测试夹具。请勿将本材料用于您不拥有或运营的系统。