Apache Camel 漏洞的复现仓库:smb 消费者通过将配置的目录与 SMB 共享列表中报告的名称拼接来构建每个轮询文件的远程路径,且没有包含性检查。SmbConsumer 自行遍历列表(不通过 RemoteFileConsumer),仅跳过精确的 . 和 .. 条目,因此任何以其他形式携带路径遍历段的名称都会被无检查地拼接——解析为轮询目录之外的路径以进行检索,并且在启用 delete/move/preMove/moveFailed/readLock=rename 时,会导致删除或重命名。
此复现器仅限作者使用——见下文——并且是 SMB 版本的对应物,与可运行的 CVE-2026-79983(
camel-ftp)和 CVE-2026-79984(camel-mina-sftp)并列,后者针对嵌入式恶意服务器 端到端演示了相同的根本原因和修复。
正如公告本身所述,通过 SMB 触达该问题
“需要一个发出非单一路径段列表名称的服务器,而符合规范的 SMB2 实现不会这样做;该暴露问题是在与其他远程文件消费者相同的基础上修正的,而非基于针对此方案的已演示概念验证。”
不存在可嵌入的恶意 SMB 服务器能够发出此类名称(不同于 FTP,Apache MINA FtpServer 的 VFS 可以被使其发出此类名称;也不同于 SFTP,Apache MINA SSHD 的 getShortName 可以被重写)。因此,本仓库携带了确切受影响的消费者接线(一个真实的 camel-smb 路由,见 SmbRoute.java / SmbRoutes.java),并记录了机制和修复,而将可运行的端到端演示留给上述 FTP 和 SFTP 复现器。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smb 4.22.0(受影响;修复于 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-smb 3.29.0(Camel 4.15.0,受影响) |
两个模块在没有 SMB 服务器的情况下均可干净编译和启动(路由以 autoStartup=false 定义)。设置
-Dsmb.enabled=true 以及 smb.host/smb.share/smb.username/smb.password,即可将确切受影响的路由指向
你自己的 SMB 服务器。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # prints the explanation + links to the runnable PoCs
docker compose down
| 属性 | 值 |
|---|---|
| 组件 | camel-smb(smb scheme) |
| CWE | CWE-22(对路径名的限制不恰当,导致受限目录访问) |
| 严重程度 | 高 |
| 攻击向量 | 共享列表名称(由服务器提供)不是单一路径段 |
| 影响 | 读取——以及在使用 delete/move/readLock=rename 时,删除或重命名——轮询目录之外的文件,使用端点的凭据 |
| 受影响版本 | 从 4.2.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-79985.html
SmbConsumer 现在应用与其他远程文件消费者相同的包含检查:解析后的路径如果落在轮询目录之外,将被跳过并发出警告,因此携带遍历段的列表名称不再能到达检索/删除/重命名操作数。
使用 filter/antInclude/include 约束消费者,仅接受单段名称,并避免对列表不完全可信的服务器使用 delete/move/preMove/moveFailed/readLock=rename。在可能的情况下,将服务器账户限制在轮询目录内。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自己是否受影响,并确认升级可以解决该问题。请勿将本材料用于您不拥有或运营的系统。