针对 Apache Camel 漏洞的可运行概念验证复现程序。在该漏洞中,camel-netty-http 的 security constraint 使用区分大小写的匹配方式,将请求路径与配置的 context path 进行比较,而将请求分发到端点的路由却没有应用同样的规则。对于任何大小写与配置值不同的路径,这两种比较结果不一致:外部调用者可以改变 context-path 段中某个字符的大小写,使 security constraint 不再将该路径识别为受保护路径,而请求仍会被分发到同一个端点。约束被跳过,受保护的路由在未满足约束的情况下被访问——无需凭据、无需事先访问权限,也无需特殊配置。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-netty-http 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-netty-http 3.29.0(Camel 4.15.0,受影响;修复对照版本 3.40.0 / Camel 4.22.1) |
一个 netty-http 消费者监听 context path /app,并由一个 SecurityConstraintMapping 保护,该映射保护 /secret(相对于端点),并使用一个拒绝请求的认证器。下面两个请求均不携带凭据:
GET /app/secret(配置的大小写)→ 约束将其识别为受保护 → 401。GET /App/secret(context-path 大小写被改变)→ 处理器的 extractTarget 仅在区分大小写的 startsWith 匹配时才剥离 context path,因此剥离被跳过,约束不会将该路径识别为受保护 → 路由器仍将其分发到 /app 端点 → 200 并返回受保护的响应体,且未经认证。在修复后的构建中,两个请求均返回 401。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
受影响构建上的预期输出:
Configured case GET /app/secret -> status 401, body:
Altered case GET /App/secret -> status 200, body: PROTECTED-ADMIN-DATA: reached the protected endpoint
>>> PROVEN: /app/secret is correctly rejected (401), but /App/secret bypassed the security constraint ...
| 属性 | 值 |
|---|---|
| 组件 | camel-netty-http |
| CWE | CWE-178(大小写敏感性处理不当) |
| 严重性 | 高 |
| 攻击向量 | context-path 大小写与配置的端点路径不同的请求 |
| 影响 | security constraint 被跳过;受保护路由在未经认证的情况下被访问 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24412 |
| 致谢 | Claude Security Scan Tool |
安全公告:https://camel.apache.org/security/CVE-2026-80343.html
security constraint 与 context-path 处理现在以一致的方式比较路径(对 context path 采用不区分大小写的比较),因此大小写被改变的请求会像其配置大小写形式一样被识别为受保护,并受到相同的认证约束。
在路由本身中强制执行授权,而不是仅依赖 netty-http 的 security constraint;或者在安全校验之前对请求路径的大小写进行规范化,直到能够升级为止。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级可以解决该问题。请勿将本材料用于您不拥有或运营的系统。