
Prova de conceito executável em Spring Boot e Quarkus que reproduz o bypass de autenticação thread-bound-subject do Apache Camel camel-shiro, com controles afetados e corrigidos.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o processador de segurança Shiro ignorava
a verificação de credenciais quando o Subject do Shiro já vinculado à thread atual carregava o mesmo principal que
o exchange de entrada. Como a thread que carrega um exchange do Camel é retirada de um pool e reutilizada entre
exchanges, um subject deixado vinculado por um exchange autenticado anterior poderia satisfazer a verificação para um exchange posterior
que apresentava nenhuma credencial válida própria — a senha desse exchange posterior nunca era verificada. O
atacante não precisa de nada além de enviar uma requisição nomeando um principal que esteja atualmente em uso ativo.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro (Camel 4.15.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido.
Uma rota é protegida por uma ShiroSecurityPolicy construída com alwaysReauthenticate=false — o modo documentado no
qual o subject autenticado é deliberadamente mantido vinculado à thread de trabalho (do pool, reutilizada) entre exchanges.
O driver de exploração, dentro de uma única thread de trabalho HTTP, executa dois exchanges em ordem:
ringo com a senha correta starr — ela autentica e deixa o subject do Shiro
vinculado a esta thread (como uma requisição autenticada anterior faria em um serviço movimentado);ringo mas com uma senha errada not-starr, na mesma
thread.AuthenticationException, mesmo que o mesmo usuário ainda esteja vinculado à thread.# 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
| Propriedade | Valor |
|---|---|
| Componente | camel-shiro (ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287 (Autenticação Incorreta) |
| Severidade | MÉDIA |
| Vetor de ataque | Uma requisição que nomeia um principal atualmente vinculado a uma worker thread reutilizada, sem portar credenciais válidas próprias |
| Impacto | Bypass de autenticação: uma requisição não autenticada é aceita como um principal já vinculado; sua senha nunca é verificada |
| Versões Afetadas | A partir de 4.0.0 antes de 4.18.5, a partir de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24439 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser não pula mais o login
quando o subject vinculado à thread já carrega o mesmo principal. O código anterior fazia um curto-circuito em
currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal()); um nome de usuário correspondente não diz nada sobre
a senha apresentada com esta exchange. O processor agora chama currentUser.login(token) em toda exchange,
de modo que as credenciais apresentadas são sempre verificadas. alwaysReauthenticate ainda controla a longevidade do rememberMe
do subject, mas não condiciona mais se a senha é verificada.
Garanta que o subject do Shiro seja limpo da thread ao final de cada exchange (para que nenhum subject possa ser herdado por uma
posterior) — por exemplo, com um onCompletion/processor que chame ThreadContext.unbindSubject() do Shiro — até
que você possa atualizar.
Este repositório é publicado para fins educacionais e defensivos: para ajudar usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. Os usuários, senhas e chaves aqui são fixtures locais inertes. Não use este material contra sistemas que você não possui ou opera.