
Preuve de concept Spring Boot exécutable reproduisant CVE-2026-85313, où Apache Camel camel-jetty enableCORS reflète n'importe quelle origine avec les identifiants, ainsi qu'un contrôle avec la version corrigée.
enableCORS accorde un accès avec identifiants depuis n'importe quelle origineReproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le réglage enableCORS=true sur un endpoint Jetty
installait le CrossOriginFilter de Jetty avec ses valeurs par défaut d'origine — qui reflètent toutes les origines et
autorisent les identifiants. Un opérateur qui avait simplement demandé CORS obtenait une politique permettant à une page de n'importe quelle origine d'effectuer
des requêtes cross-origin avec identifiants vers l'endpoint et de lire les réponses. Une origine reflétée combinée à
Access-Control-Allow-Credentials: true correspond exactement à la configuration avec identifiants depuis n'importe quelle origine que la norme Fetch
refuse de laisser exprimer par * — la réflexion étant le moyen habituel de contourner cette règle (CWE-942).
Spring Boot uniquement. Ce reproducteur ne contient qu'un seul module Camel Spring Boot. La faille se trouve dans
camel-jetty, qui embarque un serveur HTTP Jetty. Camel Quarkus n'a pas d'extensioncamel-quarkus-jetty— Quarkus sert HTTP via Vert.x (platform-http) — il n'existe donc pas d'équivalent Quarkus à reproduire. (L'avis complémentaire CVE-2026-85316 couvre la même classe de défaut dansplatform-http-vertx.) Le module Spring Boot démontre le comportement affecté et le comportement corrigé.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (affecté ; corrigé en 4.22.1), Jetty 12.1.11 |
Deux serveurs Jetty s'exécutent dans un même processus : l'endpoint vulnérable /protected (port 8081) est déclaré avec
enableCORS=true, et un endpoint vérificateur /exploit/attack (port 8080) joue le navigateur de l'attaquant. À chaque appel,
le vérificateur envoie un GET cross-origin vers /protected portant Origin: https://evil.example — une origine que
le déploiement n'a jamais autorisée — et rapporte les en-têtes CORS renvoyés.
Access-Control-Allow-Origin: https://evil.example et renvoie
Access-Control-Allow-Credentials: true — n'importe quelle origine peut lire des réponses avec identifiants.Access-Control-Allow-Credentials n'est plus envoyé pour une origine que l'opérateur n'a pas nommée.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
| Propriété | Valeur |
|---|---|
| Composant | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Politique inter-domaines permissive avec des domaines non fiables) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Une page sur n'importe quelle origine émet une requête cross-origin avec identifiants vers un endpoint configuré uniquement avec enableCORS=true |
| Impact | L'endpoint reflète l'origine de l'attaquant et accorde les identifiants, de sorte que la page de l'attaquant peut lire les réponses authentifiées |
| Versions affectées | De 4.0.0 avant 4.18.5, de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24450 |
| Crédit | Claude Security Scan Tool |
Avis : https://camel.apache.org/security/CVE-2026-85313.html
JettyHttpComponent applique désormais ses propres valeurs par défaut CORS lorsque enableCORS
est défini : allowCredentials vaut false par défaut, sauf si l'opérateur le configure explicitement. La réflexion d'origine est
laissée intacte, de sorte que l'activation de CORS continue de fonctionner pour les requêtes qui ne portent pas d'identifiants ; un opérateur qui a besoin
de requêtes cross-origin avec identifiants définit filterInit.allowCredentials=true et doit nommer les origines dans
filterInit.allowedOrigins (et est averti s'il ne le fait pas).
Configurez explicitement les paramètres de CrossOriginFilter plutôt que de vous fier à ce que enableCORS installe — nommez les
origines autorisées dans filterInit.allowedOrigins et laissez filterInit.allowCredentials désactivé sauf si vous les avez nommées.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la
vulnérabilité, à vérifier s'ils sont affectés et à confirmer que la mise à jour la résout. L'origine « attaquant » est un
espace réservé bénin (https://evil.example) et l'endpoint comme la sonde s'exécutent à l'intérieur du reproducteur. N'utilisez pas
ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.