
Prova de conceito executável em Spring Boot que reproduz a CVE-2026-85313, na qual o enableCORS do camel-jetty do Apache Camel reflete qualquer origem com credenciais, além de um controle com versão corrigida.
enableCORS concede acesso com credenciais a partir de qualquer origemReprodutor executável de prova de conceito para a vulnerabilidade do Apache Camel em que definir enableCORS=true num endpoint Jetty instalava o CrossOriginFilter do Jetty com os seus valores predefinidos de fábrica — que refletem todas as origens e permitem credenciais. Um operador que apenas pediu CORS obtinha uma política que permite a uma página de qualquer origem efetuar pedidos cross-origin com credenciais ao endpoint e ler as respostas. Uma origem refletida em conjunto com Access-Control-Allow-Credentials: true é exatamente a configuração de credenciais com qualquer origem que o padrão Fetch recusa deixar o * expressar — sendo a reflexão a forma habitual de contornar essa regra (CWE-942).
Apenas Spring Boot. Este reprodutor inclui um único módulo Camel Spring Boot. A falha está no
camel-jetty, que incorpora um servidor HTTP Jetty. O Camel Quarkus não tem extensãocamel-quarkus-jetty— o Quarkus serve HTTP sobre Vert.x (platform-http) — pelo que não existe contrapartida Quarkus a reproduzir. (O aviso complementar CVE-2026-85316 abrange a mesma classe de defeito noplatform-http-vertx.) O módulo Spring Boot demonstra o comportamento afetado e o corrigido.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (afetado; corrigido em 4.22.1), Jetty 12.1.11 |
Dois servidores Jetty correm num único processo: o endpoint vulnerável /protected (porta 8081) é declarado com
enableCORS=true, e um endpoint verificador /exploit/attack (porta 8080) desempenha o papel do navegador do atacante. Em cada chamada
o verificador envia um GET cross-origin para /protected transportando Origin: https://evil.example — uma origem que a
implementação nunca autorizou — e reporta os cabeçalhos CORS que são devolvidos.
Access-Control-Allow-Origin: https://evil.example e devolve
Access-Control-Allow-Credentials: true — qualquer origem pode ler respostas com credenciais.Access-Control-Allow-Credentials deixa de ser enviado para uma origem que o operador não indicou.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
| Propriedade | Valor |
|---|---|
| Componente | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Política Cross-domain Permissiva com Domínios Não Confiáveis) |
| Severidade | MÉDIA |
| Vetor de ataque | Uma página em qualquer origem emite uma requisição cross-origin com credenciais para um endpoint configurado apenas com enableCORS=true |
| Impacto | O endpoint reflete a origem do atacante e concede credenciais, permitindo que a página do atacante leia respostas autenticadas |
| Versões Afetadas | Da 4.0.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.1 |
| Versões Corrigidas | 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 agora aplica seus próprios padrões de CORS quando enableCORS
está definido: allowCredentials tem como padrão false, a menos que o operador o configure explicitamente. A reflexão de origem é
mantida intacta, portanto habilitar o CORS continua funcionando para requisições que não carregam credenciais; um operador que precise de
requisições cross-origin com credenciais define filterInit.allowCredentials=true e espera-se que nomeie as origens em
filterInit.allowedOrigins (e é alertado caso não o faça).
Configure os parâmetros do CrossOriginFilter explicitamente em vez de depender do que enableCORS instala — nomeie as
origens permitidas em filterInit.allowedOrigins e deixe filterInit.allowCredentials desativado, a menos que você as tenha nomeado.
Este repositório é publicado para fins educacionais e defensivos: para ajudar usuários do Apache Camel a entender a
vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. A origem do "atacante" é um
placeholder benigno (https://evil.example) e tanto o endpoint quanto a sonda são executados dentro do reprodutor. Não use
este material contra sistemas que você não possui ou opera.