针对 Apache Camel 漏洞的可运行概念验证复现程序:在该漏洞中,用于保护路由的 camel-oauth 处理器在无法完成认证时并未停止 exchange。当建立已认证会话失败本应终止路由并返回错误时,该处理器却只设置了响应码,随后将控制权交还给路由——于是请求继续流向受保护端点,仿佛认证已经成功。其结果是fail-open 认证守卫:未认证的调用者会在普通请求路径上、无需任何特殊配置,就能到达路由后续执行的任何操作。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0(受影响;修复版本 4.22.1),HTTP 通过 camel-undertow |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0(Camel 4.22.0,受影响;修复控制版本 3.40.0 / Camel 4.22.1),HTTP 通过 camel-quarkus-platform-http |
两个模块都演示了受影响以及修复后的行为。(Spring Boot 模块使用 camel-undertow 作为
HTTP 传输层——该守卫与传输层无关,而 camel-platform-http-starter 4.22.0 是针对与 3.5.x 不同的 Spring Boot 版本线构建的。)
某路由暴露 /protected,由 OAuthBearerTokenProcessor 保护;只有已认证的请求才应到达其后的受保护步骤。攻击者发送不带 Authorization 头的 GET /protected。
exchange.setRouteStop(true),因此路由
继续落入受保护步骤 → HTTP 200 以及受保护的响应体。rejectUnauthorized(...),其回复 401 并停止路由 → 受保护
步骤永远不会执行。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
受影响构建上的预期输出:
Sent: GET /protected (NO Authorization header)
Response status: 200
Response body : PROTECTED-DATA: reached the protected endpoint WITHOUT authenticating
>>> PROVEN: the OAuth guard failed open ...
在修复后的构建上:Response status: 401,响应体为 Authorization header,受保护的步骤从未执行。
| 属性 | 值 |
|---|---|
| 组件 | camel-oauth(路由守卫处理器,例如 OAuthBearerTokenProcessor) |
| CWE | CWE-287(身份验证不当) |
| 严重程度 | 高 |
| 攻击向量 | 向受 OAuth 保护的路由发送普通请求,且身份验证无法完成(此处为缺少 Authorization 头) |
| 影响 | 未经身份验证即可访问受保护端点(身份验证绕过) |
| 受影响版本 | 4.11.0 起至 4.18.5 之前,4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24411 |
| 致谢 | Claude Security Scan Tool |
安全公告:https://camel.apache.org/security/CVE-2026-80312.html
守卫处理器现在会在所有无法完成身份验证的路径上调用 rejectUnauthorized(...) / reject(...),这会设置 HTTP 状态码(401)并调用 exchange.setRouteStop(true),从而确保对于处理器未能通过身份验证的请求,后续步骤不会执行。“缺少凭据必须至少与无效凭据一样被严格拒绝。”
在守卫之后放置显式的授权检查,或确保当 CamelOAuthUserProfile exchange 属性缺失时路由终止,直到你能够升级为止。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级能够解决该问题。请勿将本材料用于你未拥有或未运营的系统。