
Proof-of-concept eseguibile in Spring Boot che riproduce CVE-2026-85317, in cui la cache dei token OAuth2 di camel-http ignora scope, resource e token endpoint, oltre a un controllo con patch applicata.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui la cache dei token del client OAuth2 di camel-http
— una mappa static globale della JVM — indicizzava le proprie voci solo su (uri, clientId, clientSecret), omettendo i campi che
determinano effettivamente il token: lo scope richiesto, il resource indicator e il token endpoint. Due
endpoint che differivano solo in questi campi condividevano quindi una voce di cache, così a un endpoint poteva essere servito un token coniato
per uno scope diverso, una risorsa diversa, o da un authorization server diverso — una richiesta che trasportava
un'autorità più ampia di quella per cui l'endpoint era configurato, oppure un token presentato a una parte per cui non era stato emesso
(CWE-524).
Solo Spring Boot. Questo reproduttore include un singolo modulo Camel Spring Boot. Il difetto è nel client OAuth2 di
camel-http, che dispone anche di un'estensionecamel-quarkus-http; ma nel packaging JVM di quell'estensione le opzioni clientoauth2*a livello di endpoint non vengono applicate come avviene sotto Spring Boot (l'intercettore delle richieste OAuth2 che possiede la cache dei token non viene mai collegato, quindi il token endpoint non viene mai chiamato) — la stessa limitazione documentata per CVE-2026-85251. Il modulo Spring Boot dimostra il comportamento affetto e quello corretto.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (affetto; corretto in 4.22.1) |
Il driver rispecchia il test di regressione della correzione stessa (HttpOAuth2TokenCachingTest). Due server HTTP usa-e-getta vengono eseguiti all'interno
del processo: un token endpoint che conia un bearer token, e un target che lo richiede. Il verificatore
(/exploit/attack):
oauth2CacheTokens=true&oauth2Scope=read — un token viene coniato e messo in cache;oauth2Scope=read+write.read —
riesce anche se il token endpoint è spento (nessun token nuovo potrebbe in alcun modo essere coniato).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
| Proprietà | Valore |
|---|---|
| Componente | camel-http (OAuth2ClientConfigurer, cache dei token) |
| CWE | CWE-524 (Uso di cache contenente informazioni sensibili) |
| Gravità | MEDIA |
| Vettore di attacco | Un deployment configura più di un endpoint OAuth2 che differiscono solo per scope, resource indicator o token endpoint; essi condividono la cache dei token globale della JVM |
| Impatto | A un endpoint viene servito un token emesso per uno scope/resource/authorization server diverso — un'autorità più ampia di quella configurata, oppure un token presentato alla parte sbagliata |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24456 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85317.html
OAuth2ClientConfigurer estende il record della chiave di cache
OAuth2URIAndCredentials per includere il token endpoint, lo scope e il resource indicator, così le voci non sono più condivise
tra endpoint che differiscono in uno qualsiasi di questi campi.
Eseguire gli endpoint che differiscono per scope, resource indicator o token endpoint in JVM separate, in modo che non condividano la cache statica.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la
vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Il token
(xxx.yyy.zzz), il client id e il secret sono segnaposto innocui ed entrambi i server HTTP vengono eseguiti in-process. Non utilizzare questo
materiale contro sistemi di cui non si è proprietari o gestori.