
Proof-of-concept eseguibile in Spring Boot che riproduce CVE-2026-85313, in cui Apache Camel camel-jetty enableCORS riflette qualsiasi origine con credenziali, più un controllo con versione corretta.
enableCORS concede accesso con credenziali da qualsiasi origineRiproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui l'impostazione di enableCORS=true su un endpoint Jetty installava il CrossOriginFilter di Jetty con i suoi valori predefiniti di fabbrica — che riflettono ogni origine e consentono le credenziali. Un operatore che aveva semplicemente richiesto il CORS otteneva una policy che permetteva a una pagina di qualsiasi origine di effettuare richieste cross-origin con credenziali verso l'endpoint e di leggerne le risposte. Un'origine riflessa insieme a Access-Control-Allow-Credentials: true è esattamente la configurazione con credenziali da qualsiasi origine che lo standard Fetch non consente di esprimere con * — la riflessione essendo il modo abituale per aggirare tale regola (CWE-942).
Solo Spring Boot. Questo riproduttore include un unico modulo Camel Spring Boot. Il difetto è in
camel-jetty, che incorpora un server HTTP Jetty. Camel Quarkus non ha un'estensionecamel-quarkus-jetty— Quarkus serve HTTP tramite Vert.x (platform-http) — quindi non esiste una controparte Quarkus da riprodurre. (L'avviso complementare CVE-2026-85316 riguarda la stessa classe di difetto inplatform-http-vertx.) 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-jetty 4.22.0 (affetto; corretto in 4.22.1), Jetty 12.1.11 |
Due server Jetty vengono eseguiti in un unico processo: l'endpoint vulnerabile /protected (porta 8081) è dichiarato con enableCORS=true, e un endpoint verificatore /exploit/attack (porta 8080) interpreta il browser dell'attaccante. A ogni chiamata il verificatore invia un GET cross-origin a /protected con Origin: https://evil.example — un'origine che il deployment non ha mai autorizzato — e riporta le intestazioni CORS restituite.
Access-Control-Allow-Origin: https://evil.example e restituisce Access-Control-Allow-Credentials: true — qualsiasi origine può leggere risposte con credenziali.Access-Control-Allow-Credentials non viene più inviato per un'origine che l'operatore non ha specificato.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: ACAO reflected + ACAC: true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85313-jetty-cors-credentials-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: ACAO reflected, ACAC absent; >>> Not exploited
| Proprietà | Valore |
|---|---|
| Componente | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Permissive Cross-domain Policy with Untrusted Domains) |
| Gravità | MEDIA |
| Vettore di attacco | Una pagina su qualsiasi origine invia una richiesta cross-origin con credenziali a un endpoint configurato solo con enableCORS=true |
| Impatto | L'endpoint riflette l'origine dell'attaccante e concede le credenziali, quindi la pagina dell'attaccante può leggere le risposte autenticate |
| 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-24450 |
| Riconoscimento | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-85313.html
JettyHttpComponent ora applica i propri valori predefiniti CORS quando enableCORS
è impostato: allowCredentials è impostato per impostazione predefinita su false a meno che l'operatore non lo configuri esplicitamente. La riflessione dell'origine è
lasciata invariata, quindi l'abilitazione di CORS continua a funzionare per le richieste che non trasportano credenziali; un operatore che necessita di
richieste cross-origin con credenziali imposta filterInit.allowCredentials=true e deve specificare le origini in
filterInit.allowedOrigins (e riceve un avviso se non lo fa).
Configurare esplicitamente i parametri di CrossOriginFilter invece di affidarsi a ciò che installa enableCORS — specificare le
origini consentite in filterInit.allowedOrigins e lasciare filterInit.allowCredentials disattivato a meno che non le si sia specificate.
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. L'origine "attacker" è un
segnaposto benigno (https://evil.example) e sia l'endpoint che la sonda vengono eseguiti all'interno del riproduttore. Non utilizzare
questo materiale contro sistemi di cui non si è proprietari o gestori.