
Reproductor ejecutable de Spring Boot y Quarkus para CVE-2026-85257, que demuestra la divulgación de información en las fallas SOAP de camel-cxf y verifica la corrección muteException.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que, cuando una ruta detrás de un consumidor SOAP de CXF fallaba con una excepción que el contrato del servicio no declara, la excepción se describía de vuelta al cliente SOAP en el fallo: CXF copia el mensaje en el faultstring de SOAP (y puede configurarse para colocar el stack trace en el detalle del fallo). Un llamador externo capaz de provocar un fallo podía, por tanto, leer detalles internos sobre el despliegue — nombres de clases y paquetes, y lo que quiera que lleve el mensaje de la excepción. Los fallos declarados (anotados con @WebFault) son otro asunto: forman parte del contrato publicado contra el que se escriben los clientes, por lo que siguen reportándose en su totalidad.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (afectado; corregido en 4.22.1), CXFServlet sobre Tomcat |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0, afectado; control corregido CQ 3.40.0 / Camel 4.22.1) |
Ambos módulos demuestran el comportamiento afectado y el corregido.
Un consumidor SOAP de CXF respalda una ruta cuyo procesador lanza una IllegalStateException no declarada que porta detalle interno simulado (un token marcador y una URL JDBC interna falsa). El driver actúa como cliente SOAP: invoca el servicio y lee el fallo SOAP que se le devuelve.
Exchange processing failed — sin portar clase, mensaje ni stack trace de la excepción de la ruta (la nueva opción de consumidor muteException tiene true por defecto). Un fallo que el contrato declara (@WebFault) seguiría devolviéndose en su totalidad.# 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
| Propiedad | Valor |
|---|---|
| Componente | camel-cxf (CxfConsumer, construcción de fallos SOAP) |
| CWE | CWE-209 (Generación de mensaje de error que contiene información confidencial) |
| Severidad | MEDIA |
| Vector de ataque | Un invocador SOAP provoca un fallo de ruta no declarado y lee el detalle de la excepción desde el fallo |
| Impacto | Divulgación de información: la clase/mensaje de la excepción (nombres de host internos, cadenas de conexión, forma de la ruta) llega a un invocador SOAP externo |
| 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-24477 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85257.html
El módulo Spring Boot monta el CXFServlet en el Tomcat embebido (un transporte Jetty de CXF independiente entra en conflicto con la versión de Jetty que gestiona Spring Boot), por lo que el endpoint SOAP se sirve en
/services/helloen el puerto 8080.
CxfConsumer añade una opción de consumidor muteException (por defecto true).
Para un fallo de ruta no declarado, ahora construye el fallo a partir de un Exception("Exchange processing failed") de sustitución
con un stack trace vacío, en lugar de la excepción de la ruta — de modo que ningún nombre de clase, mensaje o stack trace llega al
invocador. Una excepción que el contrato declara (@WebFault) se detecta y se reporta en su totalidad, porque suprimirla
rompería el servicio. Establezca muteException=false para restaurar la salida anterior.
Declare las excepciones que el servicio tiene permitido reportar y asigne cualquier otro fallo a una de ellas en un
manejador onException, de modo que ninguna excepción no declarada llegue al fallo.
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 token marcador y la URL JDBC en la ruta fallida son fixtures locales ficticios e inertes. No utilice este material contra sistemas que no posea o opere.