
Prueba de concepto ejecutable de Spring Boot que reproduce CVE-2026-85317, donde la caché de tokens OAuth2 de camel-http ignora el scope, el recurso y el endpoint de tokens, además de un control parcheado.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que la caché de tokens del cliente OAuth2 de camel-http
— un mapa static global de la JVM — indexaba sus entradas solo por (uri, clientId, clientSecret), omitiendo los campos que
realmente determinan el token: el scope solicitado, el indicador de recurso y el endpoint de token. Dos
endpoints que difieren solo en esos campos compartían por tanto una entrada de caché, de modo que a un endpoint se le podía servir un token emitido
para un scope diferente, un recurso diferente o por un servidor de autorización diferente — una petición que portaba
una autoridad más amplia que aquella para la que el endpoint estaba configurado, o un token presentado a una parte para la que no fue emitido
(CWE-524).
Solo Spring Boot. Este reproductor incluye un único módulo Camel Spring Boot. El fallo está en el cliente OAuth2 de
camel-http, que también tiene una extensióncamel-quarkus-http; pero en el empaquetado JVM de esa extensión las opciones de clienteoauth2*a nivel de endpoint no se aplican de la misma forma que bajo Spring Boot (el interceptor de peticiones OAuth2 que posee la caché de tokens nunca se conecta, por lo que el endpoint de token nunca se invoca) — la misma limitación documentada para CVE-2026-85251. El módulo Spring Boot demuestra el comportamiento afectado y el corregido.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (afectado; corregido en 4.22.1) |
El driver replica la propia prueba de regresión de la corrección (HttpOAuth2TokenCachingTest). Dos servidores HTTP desechables se ejecutan dentro
del proceso: un endpoint de token que emite un token bearer, y un objetivo que lo requiere. El verificador
(/exploit/attack):
oauth2CacheTokens=true&oauth2Scope=read — se emite un token y se almacena en caché;oauth2Scope=read+write.read —
tiene éxito aunque el endpoint de token ya no esté disponible (no podría emitirse ningún token nuevo).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
| Propiedad | Valor |
|---|---|
| Componente | camel-http (OAuth2ClientConfigurer, caché de tokens) |
| CWE | CWE-524 (Uso de caché que contiene información sensible) |
| Gravedad | MEDIA |
| Vector de ataque | Un despliegue configura más de un endpoint OAuth2 que difieren solo en el scope, el indicador de recurso o el endpoint de token; comparten la caché de tokens global de la JVM |
| Impacto | A un endpoint se le entrega un token emitido para un scope/recurso/servidor de autorización diferente — una autoridad más amplia que la configurada, o un token presentado a la parte equivocada |
| Versiones afectadas | Desde 4.0.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 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 amplía el registro de clave de caché
OAuth2URIAndCredentials para incluir el endpoint de token, el scope y el indicador de recurso, de modo que las entradas ya no se comparten
entre endpoints que difieren en cualquiera de esos campos.
Ejecute los endpoints que difieren en scope, indicador de recurso o endpoint de token en JVM separadas para que no compartan la caché estática.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la
vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El token
(xxx.yyy.zzz), el client id y el secret son marcadores de posición benignos y ambos servidores HTTP se ejecutan en proceso. No utilice este
material contra sistemas que no sean de su propiedad o que no opere.