针对 Apache Camel 漏洞的可运行概念验证复现程序:当已绑定到当前线程的 Shiro Subject 携带的主体(principal)与传入的 exchange 相同时,Shiro 安全处理器会跳过凭据验证。由于承载 Camel exchange 的线程来自线程池并在多个 exchange 之间复用,先前一次已认证的 exchange 遗留绑定的 subject 可能满足后续一次自身未提供任何有效凭据的 exchange 的检查——后续 exchange 上的密码从未被验证。攻击者只需发送一个请求,指定一个当前正在使用中的主体即可。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro(Camel 4.15.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块均演示了受影响以及修复后的行为。
一条路由由使用 alwaysReauthenticate=false 构建的 ShiroSecurityPolicy 保护——这是文档中记载的模式,在该模式下,已认证的 subject 会被有意保留绑定到(池化、复用的)工作线程上,跨越多个 exchange。漏洞利用驱动程序在同一个 HTTP 工作线程内按顺序运行两个 exchange:
ringo 发起的合法请求,使用正确的密码 starr——它通过认证,并将 Shiro subject 绑定到该线程(正如繁忙服务中先前一次已认证请求所做的那样);ringo,但使用错误的密码 not-starr,在同一个线程上。AuthenticationException 拒绝,即使同一用户仍绑定在该线程上。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wrong password reaches protected logic; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84181-shiro-auth-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected; >>> 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.15.0): wrong password reaches protected logic
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: wrong password rejected
| 属性 | 值 |
|---|---|
| 组件 | camel-shiro(ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287(身份验证不当) |
| 严重程度 | 中危 |
| 攻击向量 | 一个请求指定了当前绑定到被复用的工作线程的主体,且自身不携带任何有效凭据 |
| 影响 | 身份验证绕过:未认证的请求被当作已绑定的主体接受;其密码从未被验证 |
| 受影响版本 | 从 4.0.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24439 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser 不再在线程绑定的 subject 已携带相同主体时跳过登录。此前的代码在
currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal()) 处短路返回;用户名匹配并不能说明
本次交换所提交的密码是否正确。该处理器现在会在每一次交换时调用 currentUser.login(token),
因此所提交的凭据始终会被验证。alwaysReauthenticate 仍然控制 subject 的 rememberMe 有效期,
但它不再决定是否检查密码。
确保在每次交换结束时从线程中清除 Shiro subject(这样后续交换就不会继承任何 subject)——例如使用一个
onCompletion/处理器来调用 Shiro 的 ThreadContext.unbindSubject()——直到你能够升级为止。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、确认自己是否受影响,并验证升级能否解决该问题。 此处的用户、密码和密钥均为无实际作用的本地测试数据。请勿将本材料用于你并不拥有或运营的系统。