
Prova de conceito executável em Spring Boot que reproduz a CVE-2026-85317, na qual o cache de tokens OAuth2 do camel-http ignora o escopo, o recurso e o endpoint de token, além de um controle corrigido.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o cache de tokens do cliente OAuth2 do camel-http
— um mapa static global da JVM — indexava suas entradas apenas por (uri, clientId, clientSecret), omitindo os campos que
de fato moldam o token: o escopo solicitado, o indicador de recurso e o endpoint de token. Dois
endpoints que diferissem apenas nesses campos, portanto, compartilhavam uma entrada de cache, de modo que um endpoint poderia receber um token emitido
para um escopo diferente, um recurso diferente ou por um servidor de autorização diferente — uma requisição carregando
autoridade mais ampla do que a configurada para o endpoint, ou um token apresentado a uma parte para a qual não foi emitido
(CWE-524).
Somente Spring Boot. Este reprodutor inclui um único módulo Camel Spring Boot. A falha está no cliente OAuth2 do
camel-http, que também possui uma extensãocamel-quarkus-http; mas no empacotamento JVM dessa extensão as opções de clienteoauth2*no nível do endpoint não são aplicadas da mesma forma que no Spring Boot (o interceptor de requisição OAuth2 que possui o cache de tokens nunca é conectado, então o endpoint de token nunca é chamado) — a mesma limitação documentada para CVE-2026-85251. O módulo Spring Boot demonstra o comportamento afetado e o corrigido.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (afetado; corrigido em 4.22.1) |
O driver espelha o próprio teste de regressão da correção (HttpOAuth2TokenCachingTest). Dois servidores HTTP descartáveis são executados dentro
do processo: um endpoint de token que emite um bearer token, e um alvo que o exige. O verificador
(/exploit/attack):
oauth2CacheTokens=true&oauth2Scope=read — um token é emitido e armazenado em cache;oauth2Scope=read+write.read —
ela é bem-sucedida mesmo com o endpoint de token desligado (nenhum token novo poderia ser emitido).HttpHostConnectException).cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: 2nd request 200 (reused read token); >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85317-http-oauth2-token-cache-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 2nd request HttpHostConnectException; >>> Not exploited
| Propriedade | Valor |
|---|---|
| Componente | camel-http (OAuth2ClientConfigurer, cache de tokens) |
| CWE | CWE-524 (Uso de Cache Contendo Informações Sensíveis) |
| Severidade | MÉDIA |
| Vetor de ataque | Uma implantação configura mais de um endpoint OAuth2 que difere apenas em escopo, indicador de recurso ou endpoint de token; eles compartilham o cache de tokens global da JVM |
| Impacto | Um endpoint recebe um token emitido para um escopo/recurso/servidor de autorização diferente — autoridade mais ampla do que a configurada, ou um token apresentado à parte errada |
| 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-24456 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85317.html
OAuth2ClientConfigurer estende o registro de chave de cache
OAuth2URIAndCredentials para incluir o endpoint de token, o escopo e o indicador de recurso, de modo que as entradas não são mais compartilhadas
entre endpoints que diferem em qualquer um desses campos.
Execute endpoints que diferem em escopo, indicador de recurso ou endpoint de token em JVMs separadas para que eles não compartilhem o cache estático.
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 token
(xxx.yyy.zzz), o client id e o secret são placeholders benignos e ambos os servidores HTTP são executados em processo. Não use este
material contra sistemas que você não possui ou opera.