
Reprodutor de prova de conceito executável para o bypass de validação de emissor do Apache Camel camel-keycloak (CWE-287), demonstrando o comportamento afetado e corrigido em Spring Boot e Quarkus.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o
KeycloakSecurityProcessor do camel-keycloak validava o emissor de um token introspectado apenas quando a resposta de introspecção
realmente continha uma claim iss. Quando a claim estava ausente, a verificação era ignorada em vez de tratada como uma
falha, de modo que um token que o emissor configurado não emitiu poderia ser aceito — desde que o endpoint de introspecção
respondesse active sem indicar um emissor. Quando uma implantação faz introspecção contra um endpoint que omite iss e
atende mais de um emissor, a consequência é que ela autentica um chamador que deveria ter rejeitado (CWE-287).
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak (Camel 4.22.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido contra o KeycloakSecurityProcessor real.
O driver configura um KeycloakSecurityPolicy com validateIssuer=true (emissor esperado
http://localhost:8080/realms/test-realm) e um introspector de token que reporta o token como ativo, mas retorna
nenhuma claim iss — exatamente o que um endpoint de introspecção de broker/gateway produz, já que a RFC 7662 torna iss
opcional. Em seguida, aciona um KeycloakSecurityProcessor com um cabeçalho Authorization: Bearer <attacker-token> e
informa se a rota protegida é alcançada.
iss faz o processador ignorar a verificação do emissor, então o token é aceito e a
rota é alcançada — um token de um emissor não intencional é autenticado.iss ausente é uma falha de validação; o processador lança CamelAuthorizationException
("Token issuer missing…") e a rota nunca é alcançada.# 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"
| Propriedade | Valor |
|---|---|
| Componente | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (Autenticação Incorreta) |
| Severidade | MÉDIA |
| Vetor de ataque | Um token de um emissor não intencional, introspectado contra um endpoint que omite iss e atende mais de um emissor, enquanto validateIssuer=true |
| Impacto | A implantação autentica um chamador cujo token não foi emitido pelo emissor configurado |
| Versões Afetadas | Da 4.15.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24448 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85301.html
O módulo afetado do Quarkus é construído sobre o CQ 3.39.0 (Camel 4.22.0), onde
camel-quarkus-keycloakmapeia para uma versão afetada do Camel. O controle corrigido é o CQ 3.40.0 (Camel 4.22.1).
KeycloakSecurityProcessor agora trata uma claim iss ausente como uma
falha de validação: quando a validação de emissor está habilitada e o resultado da introspecção não traz emissor, ele lança
CamelAuthorizationException em vez de retornar antecipadamente e deixar a requisição passar. O código anterior ignorava a
comparação sempre que a claim estava ausente, o que deixava o emissor não verificado exatamente para os tokens que não
nomeavam nenhum emissor.
Garanta que o endpoint de introspecção retorne a claim iss e atenda exatamente um emissor, de modo que um token de qualquer outro
emissor seja nomeado (e rejeitado) ou nunca seja introspectado como ativo.
Este repositório é publicado para fins educacionais e defensivos: para ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O introspector de token é um stub em processo e nenhum servidor Keycloak real ou chamada de rede está envolvido; o "token do atacante" é uma string placeholder opaca. Não use este material contra sistemas que você não possui ou opera.