
Reproductor ejecutable de prueba de concepto para CVE-2026-85315, que demuestra la divulgación de mensajes de excepción del consumidor de camel-grpc (CWE-209) en Camel Spring Boot y Quarkus.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que, cuando una ruta detrás de un consumidor gRPC
fallaba, el mensaje de la excepción de la ruta se copiaba en la descripción del Status de gRPC. A diferencia de la causa del estado
(withCause(...)), que permanece local en el servidor, la descripción se transmite al cliente que realiza la llamada, por lo que un
llamador externo capaz de provocar un fallo podía leer el mensaje de error interno — en la práctica, nombres de clases y paquetes,
rutas de archivos, nombres de host y detalles de conexión contenidos en los mensajes de excepción (CWE-209). Este es el miembro gRPC de la
misma familia de excepciones de consumidor no silenciadas que los avisos de knative, mina y CXF publicados junto a él.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0, afectado; control corregido CQ 3.40.0 / Camel 4.22.1) |
Ambos módulos demuestran el comportamiento afectado y el corregido frente al consumidor real de camel-grpc.
Cada módulo ejecuta un consumidor de camel-grpc (el servicio PingPong del propio proto de pruebas de camel-grpc) cuya ruta siempre
falla con un mensaje de aspecto interno:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
El endpoint verificador /exploit/attack actúa como un cliente gRPC externo: llama a PingSyncSync, captura la
StatusRuntimeException e informa el código Status y la descripción que el servidor devolvió.
muteException tiene como valor predeterminado true, por lo que la descripción es la genérica
"Exchange processing failed" y el mensaje real nunca sale del servidor (se conserva únicamente en la
causa del estado local).# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> 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.22.0): description leaks the internal message
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: description is "Exchange processing failed"
Cada módulo sirve el verificador en 8080 y ejecuta el consumidor camel-grpc en 50051 dentro del mismo proceso; solo
se publica 8080.
| Propiedad | Valor |
|---|---|
| Componente | camel-grpc (GrpcMethodHandler, consumidor) |
| CWE | CWE-209 (Generación de mensaje de error que contiene información sensible) |
| Severidad | MEDIA |
| Vector de ataque | Un cliente gRPC externo provoca un fallo de ruta y lee la descripción del Status transmitido |
| Impacto | El detalle del error interno (nombres de clase/paquete, rutas, nombres de host, detalle de conexión) se divulga al llamador |
| 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-24478 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85315.html
El módulo afectado de Quarkus está construido sobre CQ 3.39.0 (Camel 4.22.0). El control parcheado es CQ 3.40.0 (Camel 4.22.1).
GrpcMethodHandler añade una opción de consumidor muteException (por defecto
true). Cuando está habilitada, un intercambio fallido produce la descripción genérica "Exchange processing failed" en el
estado transmitido; la excepción de la ruta sigue adjuntándose localmente mediante withCause(...), que gRPC no envía
al cliente. Establezca muteException=false en el endpoint para restaurar el comportamiento anterior.
Asigne los fallos a un estado explícito en un manejador onException para que el framework nunca copie el mensaje de la excepción
en la descripción.
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 mensaje "interno" es un
marcador de posición benigno (db.internal.local, svc_admin) y toda la demostración se ejecuta en un solo proceso. No utilice este
material contra sistemas que no sean de su propiedad o que no opere.