
Prueba de concepto ejecutable de Spring Boot que reproduce CVE-2026-85313, donde Apache Camel camel-jetty enableCORS refleja cualquier origen con credenciales, además de un control con la versión corregida.
enableCORS otorga acceso con credenciales desde cualquier origenReproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que establecer enableCORS=true en un endpoint de Jetty instalaba el CrossOriginFilter de Jetty con sus valores predeterminados de fábrica — que reflejan todos los orígenes y permiten credenciales. Un operador que simplemente solicitó CORS obtenía una política que permite a una página de cualquier origen realizar solicitudes cross-origin con credenciales al endpoint y leer las respuestas. Un origen reflejado junto con Access-Control-Allow-Credentials: true es exactamente la configuración con credenciales desde cualquier origen que el estándar Fetch no permite expresar con * — siendo el reflejo la forma habitual de eludir esa regla (CWE-942).
Solo Spring Boot. Este reproductor incluye un único módulo de Camel Spring Boot. El fallo está en
camel-jetty, que incorpora un servidor HTTP Jetty. Camel Quarkus no tiene una extensióncamel-quarkus-jetty— Quarkus sirve HTTP sobre Vert.x (platform-http) — por lo que no existe una contraparte en Quarkus que reproducir. (El aviso complementario CVE-2026-85316 cubre la misma clase de defecto enplatform-http-vertx.) El módulo de Spring Boot demuestra el comportamiento afectado y el corregido.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (afectado; corregido en 4.22.1), Jetty 12.1.11 |
Dos servidores Jetty se ejecutan en un mismo proceso: el endpoint vulnerable /protected (puerto 8081) se declara con enableCORS=true, y un endpoint verificador /exploit/attack (puerto 8080) hace el papel del navegador del atacante. En cada llamada, el verificador envía un GET cross-origin a /protected con Origin: https://evil.example — un origen que el despliegue nunca autorizó — e informa las cabeceras CORS que se devuelven.
Access-Control-Allow-Origin: https://evil.example y devuelve Access-Control-Allow-Credentials: true — cualquier origen puede leer respuestas con credenciales.Access-Control-Allow-Credentials ya no se envía para un origen que el operador no haya nombrado.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
| Propiedad | Valor |
|---|---|
| Componente | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Política entre dominios permisiva con dominios no confiables) |
| Gravedad | MEDIA |
| Vector de ataque | Una página en cualquier origen emite una solicitud entre orígenes con credenciales a un endpoint configurado solo con enableCORS=true |
| Impacto | El endpoint refleja el origen del atacante y otorga credenciales, por lo que la página del atacante puede leer respuestas autenticadas |
| 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-24450 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85313.html
JettyHttpComponent ahora aplica sus propios valores predeterminados de CORS cuando se establece enableCORS: allowCredentials toma el valor predeterminado false a menos que el operador lo configure explícitamente. La reflexión de origen se deja intacta, por lo que habilitar CORS sigue funcionando para solicitudes que no llevan credenciales; un operador que necesite solicitudes entre orígenes con credenciales establece filterInit.allowCredentials=true y se espera que nombre los orígenes en filterInit.allowedOrigins (y se le advierte si no lo hace).
Configure los parámetros de CrossOriginFilter explícitamente en lugar de depender de lo que instala enableCORS: nombre los orígenes permitidos en filterInit.allowedOrigins y deje filterInit.allowCredentials desactivado a menos que los haya nombrado.
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 origen del "atacante" es un marcador de posición benigno (https://evil.example) y tanto el endpoint como la sonda se ejecutan dentro del reproductor. No utilice este material contra sistemas que no sean de su propiedad o que no opere.