
Reproductor ejecutable de Spring Boot para CVE-2026-85246, que demuestra la divulgación de excepciones del consumidor de camel-mina a través del socket y verifica la corrección muteException.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el consumidor de Mina escribía
exchange.getException() directamente de vuelta sobre el socket al par remoto cuando fallaba el procesamiento de un exchange.
Sobre un códec textline, entrega al par el nombre de clase y el mensaje de la excepción; sobre el códec de objetos, entrega
la excepción serializada, incluida la cadena de causas. Un par remoto capaz de provocar un fallo podía leer detalles internos
sobre el despliegue — nombres de clases y paquetes, y lo que quiera que lleve un mensaje o una causa anidada, lo que en la práctica
incluye rutas, nombres de host y detalles de conexión. El consumidor no tenía opción de suprimir esto, a diferencia de los
consumidores de la familia HTTP alineados por CAMEL-23651.
Solo Spring Boot. No existe una extensión
camel-quarkus-mina, por lo que este reproductor incluye un único módulo Camel Spring Boot. (El fallo está en elMinaConsumerdel componente, que es independiente del runtime.)
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (afectado; corregido en 4.22.1) |
Un consumidor TCP de Mina (sync=true, textline=true) procesa cada línea entrante y falla — representando cualquier ruta
que sufre un error interno. La ruta lanza una IllegalStateException cuyo mensaje lleva detalle interno simulado (una ruta
de configuración falsa /etc/camel/secret.properties, un host falso y un token marcador). El driver de explotación es un par
TCP remoto simple: abre un socket, envía una línea y lee la respuesta que el consumidor escribe de vuelta.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed genérica — sin clase, mensaje ni traza
de pila de la excepción de la ruta — a la vez que sigue respondiendo, de modo que un par síncrono no queda esperando hasta
agotar el tiempo de espera.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| Propiedad | Valor |
|---|---|
| Componente | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (Generación de mensaje de error que contiene información confidencial) |
| Gravedad | MEDIA |
| Vector de ataque | Un par remoto TCP/UDP provoca un fallo de ruta y lee la excepción de la respuesta escrita de vuelta por el socket |
| Impacto | Divulgación de información: clase/mensaje de la excepción a través del códec textline, o la excepción serializada + cadena de causas a través del códec de objetos (nombres de host internos, rutas, detalles de conexión) |
| 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-24476 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85246.html
MinaConsumer añade una opción de consumidor muteException (por defecto true).
Cuando está habilitada, un exchange fallido ya no escribe exchange.getException() de vuelta; en su lugar escribe una
Exception("Exchange processing failed") sustituta con una traza de pila vacía — sigue siendo una Exception (por lo que un par con códec de objetos
sigue recibiendo una) pero sin transportar la clase, el mensaje ni los frames de la excepción de la ruta. Aún se escribe una respuesta para que
un par síncrono no quede esperando hasta agotar el tiempo de espera. Establezca muteException=false para restaurar el comportamiento anterior.
Añada un manejador onException que establezca explícitamente el cuerpo de la respuesta, de modo que el framework nunca escriba la excepción de vuelta
al par.
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. La ruta de configuración, el host y el token marcador en la ruta fallida son fixtures locales inertes e inventados. No utilice este material contra sistemas que no sean de su propiedad o que no opere.