
Reprodutor executável em Spring Boot e Quarkus para a CVE-2026-85257, demonstrando a divulgação de informações em falhas SOAP do camel-cxf e verificando a correção muteException.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que, quando uma rota por trás de um consumidor SOAP CXF falhava com uma exceção que o contrato de serviço não declara, a exceção era descrita de volta ao cliente SOAP na falha: o CXF copia a mensagem para o faultstring do SOAP (e pode ser configurado para colocar o stack trace no detalhe da falha). Um chamador externo capaz de provocar uma falha poderia, portanto, ler detalhes internos sobre a implantação — nomes de classes e pacotes, e tudo o que a mensagem da exceção carrega. Falhas declaradas (anotadas com @WebFault) são um caso diferente: fazem parte do contrato publicado contra o qual os clientes são escritos, por isso continuam a ser reportadas na íntegra.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (afetado; corrigido em 4.22.1), CXFServlet no Tomcat |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0, afetado; controlo corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido.
Um consumidor SOAP CXF suporta uma rota cujo processador lança uma IllegalStateException não declarada que transporta detalhes internos simulados (um token marcador e um URL JDBC interno falso). O driver atua como cliente SOAP: invoca o serviço e lê a falha SOAP que lhe é devolvida.
Exchange processing failed — sem transportar classe, mensagem ou stack trace da exceção da rota (a nova opção de consumidor muteException tem como predefinição true). Uma falha que o contrato declara (@WebFault) continuaria a ser devolvida na íntegra.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): fault leaks internal detail
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault
| Propriedade | Valor |
|---|---|
| Componente | camel-cxf (CxfConsumer, construção de SOAP fault) |
| CWE | CWE-209 (Geração de Mensagem de Erro Contendo Informações Sensíveis) |
| Severidade | MÉDIA |
| Vetor de ataque | Um chamador SOAP provoca uma falha de rota não declarada e lê o detalhe da exceção a partir do fault |
| Impacto | Divulgação de informações: classe/mensagem da exceção (nomes de host internos, strings de conexão, estrutura da rota) chegam a um chamador SOAP externo |
| Versões Afetadas | A partir de 4.0.0 antes de 4.18.5, a partir de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24477 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85257.html
O módulo Spring Boot monta o CXFServlet no Tomcat embarcado (um transporte CXF Jetty autônomo entra em conflito com a versão do Jetty gerenciada pelo Spring Boot), portanto o endpoint SOAP é servido em
/services/hellona porta 8080.
CxfConsumer adiciona uma opção de consumer muteException (padrão true).
Para uma falha de rota não declarada, agora ele constrói o fault a partir de uma Exception("Exchange processing failed")
substituta com um stack trace vazio, em vez da exceção da rota — assim nenhum nome de classe, mensagem ou stack trace chega ao
chamador. Uma exceção declarada pelo contrato (@WebFault) é detectada e reportada integralmente, pois suprimi-la
quebraria o serviço. Defina muteException=false para restaurar a saída anterior.
Declare as exceções que o serviço tem permissão de reportar e mapeie todas as outras falhas para uma delas em um
handler onException, para que nenhuma exceção não declarada chegue ao fault.
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. O token marcador e a URL JDBC na rota com falha são fixtures locais inertes e fictícias. Não use este material contra sistemas que você não possui ou opera.