针对 Apache Camel 漏洞的可运行概念验证复现程序:camel-keycloak 的
KeycloakSecurityProcessor 仅在 introspection 响应实际携带 iss 声明时才校验被 introspect 令牌的
issuer。当该声明缺失时,校验会被跳过,而不是被视为失败,因此,只要 introspection 端点返回 active
且未指明 issuer,配置的 issuer 并未签发的令牌就可能被接受。如果某个部署针对一个省略 iss 且服务于多个
issuer 的端点进行 introspection,其后果就是它会认证一个本应被拒绝的调用方(CWE-287)。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak(Camel 4.22.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块都针对真实的 KeycloakSecurityProcessor 演示了受影响和已修复的行为。
驱动程序配置了一个 KeycloakSecurityPolicy,设置 validateIssuer=true(预期 issuer 为
http://localhost:8080/realms/test-realm),并配置一个令牌 introspector,该 introspector 报告令牌为
active,但返回没有 iss 声明——这正是 broker/gateway introspection 端点会产生的结果,因为
RFC 7662 将 iss 设为可选。随后,它使用 Authorization: Bearer <attacker-token> 头驱动
KeycloakSecurityProcessor,并报告是否到达受保护路由。
iss 使处理器跳过 issuer 校验,因此令牌被接受并到达路由——来自非预期 issuer 的令牌被认证。iss 属于校验失败;处理器抛出 CamelAuthorizationException
(“Token issuer missing…”),且路由永远不会被到达。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): route reached, token accepted
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"
| 属性 | 值 |
|---|---|
| 组件 | camel-keycloak(KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287(认证不当) |
| 严重性 | 中 |
| 攻击向量 | 来自非预期签发者的令牌,针对一个省略 iss 且服务于多个签发者的端点进行内省,同时 validateIssuer=true |
| 影响 | 部署会认证一个其令牌并非由所配置签发者签发的调用方 |
| 受影响版本 | 从 4.15.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24448 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85301.html
Quarkus 受影响模块基于 CQ 3.39.0(Camel 4.22.0)构建,其中
camel-quarkus-keycloak映射到 受影响的 Camel 版本。修复后的控制版本为 CQ 3.40.0(Camel 4.22.1)。
KeycloakSecurityProcessor 现在将缺失的 iss 声明视为
验证失败:当启用签发者验证且内省结果不携带签发者时,它会抛出
CamelAuthorizationException,而不是提前返回并放行请求。先前的代码在声明缺失时会跳过
比较,这恰好使得那些未指明签发者的令牌的签发者未经验证。
确保内省端点返回 iss 声明并且仅服务于一个签发者,这样来自任何其他
签发者的令牌要么被指明(并被拒绝),要么永远不会被内省为有效。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该 漏洞、验证自身是否受影响,并确认升级可以解决该问题。令牌内省器是一个 进程内桩,不涉及真实的 Keycloak 服务器或网络调用;“攻击者令牌”是一个不透明的占位 字符串。请勿将本材料用于您不拥有或运营的系统。