state)针对 Apache Camel 漏洞的可运行概念验证复现程序。该漏洞中,OAuth 授权码回调未携带 state 参数将其与发起流程的授权请求绑定,也未对其进行校验。因此,在任意浏览器中获取的授权码都可以在回调处被兑换,并关联到提交该回调的任意会话——登录跨站请求伪造:受害者会在不知情的情况下以攻击者控制的身份登录,导致受害者后续的操作和数据落入攻击者的账户。(同一个未校验的回调还允许影响认证后的重定向目标——即开放重定向。)正如公告所述,state 校验在授权码兑换之前执行,因此无需与身份提供方进行任何交互即可触发该差异。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0(受影响;修复版本 4.22.1),回调通过 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),回调通过 camel-quarkus-platform-http |
两个模块均演示了受影响和修复后的行为。
真实、未经修改的 OAuthCodeFlowCallback 处理器负责处理回调端点。一个极小的 stub OAuth 被注册到 Camel registry 中,使回调无需真实身份提供方即可运行——它仅替代 IdP,并记录授权码何时被兑换(在真实流程中,兑换会将生成的标识绑定到提交会话)。攻击者只需携带 code 且无匹配的 state 访问回调:
state 与此会话发起的授权请求匹配)——授权码永远不会被兑换。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
受影响构建上的预期输出:
Request: GET /callback?code=ATTACKER-SUPPLIED-AUTH-CODE (no 'state' parameter)
Callback HTTP status: 302
>>> PROVEN: the callback redeemed the authorization code ... WITHOUT verifying a state parameter ... login CSRF.
| 属性 | 值 |
|---|---|
| 组件 | camel-oauth(授权码回调,OAuthCodeFlowCallback) |
| CWE | CWE-352(跨站请求伪造) |
| 严重程度 | 中危 |
| 攻击向量 | 携带授权码的回调请求,其 state 未与会话的授权请求绑定 |
| 影响 | 登录 CSRF(受害者以攻击者控制的身份登录);来自受信任源的开放重定向 |
| 受影响版本 | 从 4.11.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24437 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-84178.html
回调现在会携带并验证一个一次性 state 参数,该参数与会话发起的授权请求绑定:expectedState = session.removeValue(OAUTH_STATE),并与 state 查询参数进行(恒定时间)比较。如果没有正在进行的流程,或 state 不匹配,回调会在兑换授权码之前拒绝该请求。
将回调置于强制实施 CSRF state 绑定的组件之后,或在能够升级之前,不要依赖 OAuth 授权码流程回调来建立会话。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自身是否受影响,并确认升级可解决该问题。桩身份提供程序和“攻击者代码”均为无实际作用的本地测试夹具。请勿将本材料用于您不拥有或运营的系统。