
Lauffähiger Spring-Boot-Proof-of-Concept zur Reproduktion von CVE-2026-85313, bei dem Apache Camel camel-jetty enableCORS jeden Origin mit Credentials reflektiert, plus eine Kontrollvariante mit fester Version.
enableCORS gewährt credentierten Zugriff von beliebigem OriginLauffähiger Proof-of-Concept-Reproducer für die Apache-Camel-Schwachstelle, bei der das Setzen von enableCORS=true auf einem Jetty-Endpoint Jetty's CrossOriginFilter mit seinen Standardwerten installierte — die jeden Origin reflektieren und Credentials erlauben. Ein Operator, der lediglich CORS angefordert hatte, erhielt eine Policy, die es einer Seite von jedem Origin erlaubt, credentierte Cross-Origin-Anfragen an den Endpoint zu stellen und die Antworten zu lesen. Ein reflektierter Origin zusammen mit Access-Control-Allow-Credentials: true ist genau die credentierte Any-Origin-Konfiguration, die der Fetch-Standard nicht durch * ausdrücken lässt — Reflection ist der übliche Weg um diese Regel herum (CWE-942).
Nur Spring Boot. Dieser Reproducer enthält ein einzelnes Camel-Spring-Boot-Modul. Der Fehler liegt in
camel-jetty, das einen Jetty-HTTP-Server einbettet. Camel Quarkus hat keinecamel-quarkus-jetty-Extension — Quarkus stellt HTTP über Vert.x bereit (platform-http) —, daher gibt es kein Quarkus-Pendant zum Reproduzieren. (Die begleitende Advisory CVE-2026-85316 deckt dieselbe Fehlerklasse inplatform-http-vertxab.) Das Spring-Boot-Modul demonstriert das betroffene und das behobene Verhalten.
| Runtime | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (betroffen; behoben in 4.22.1), Jetty 12.1.11 |
Zwei Jetty-Server laufen in einem Prozess: Der verwundbare Endpoint /protected (Port 8081) ist mit enableCORS=true deklariert, und ein Verifier-Endpoint /exploit/attack (Port 8080) spielt den Browser des Angreifers. Bei jedem Aufruf sendet der Verifier eine Cross-Origin-GET-Anfrage an /protected mit Origin: https://evil.example — einem Origin, den das Deployment nie autorisiert hat — und meldet die zurückkommenden CORS-Header.
Access-Control-Allow-Origin: https://evil.example und gibt Access-Control-Allow-Credentials: true zurück — jeder Origin kann credentierte Antworten lesen.Access-Control-Allow-Credentials wird für einen Origin, den der Operator nicht benannt hat, nicht mehr gesendet.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
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Permissive Cross-domain Policy with Untrusted Domains) |
| Schweregrad | MITTEL |
| Angriffsvektor | Eine Seite beliebigen Ursprungs stellt eine credentialisierte Cross-Origin-Anfrage an einen Endpunkt, der nur mit enableCORS=true konfiguriert ist |
| Auswirkung | Der Endpunkt spiegelt den Ursprung des Angreifers wider und gewährt Credentials, sodass die Angreiferseite authentifizierte Antworten lesen kann |
| Betroffene Versionen | Von 4.0.0 vor 4.18.5, von 4.19.0 vor 4.22.1 |
| Behobene Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24450 |
| Danksagung | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85313.html
JettyHttpComponent wendet nun eigene CORS-Standardwerte an, wenn enableCORS
gesetzt ist: allowCredentials ist standardmäßig false, sofern der Betreiber es nicht explizit konfiguriert. Die
Origin-Reflexion bleibt unverändert, sodass das Aktivieren von CORS weiterhin für Anfragen funktioniert, die keine
Credentials mitführen; ein Betreiber, der credentialisierte Cross-Origin-Anfragen benötigt, setzt
filterInit.allowCredentials=true und wird erwartet, die Ursprünge in filterInit.allowedOrigins anzugeben (und wird
gewarnt, wenn er dies nicht tut).
Konfigurieren Sie die Parameter des CrossOriginFilter explizit, anstatt sich auf das zu verlassen, was enableCORS
installiert — geben Sie die erlaubten Ursprünge in filterInit.allowedOrigins an und lassen Sie
filterInit.allowCredentials deaktiviert, sofern Sie diese nicht angegeben haben.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache-Camel-Nutzern zu helfen, die
Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Der
„Angreifer“-Ursprung ist ein harmloser Platzhalter (https://evil.example), und sowohl der Endpunkt als auch die Probe
laufen innerhalb des Reproducers. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie
nicht betreiben.