
PoC riproduttore per CVE-2026-56139 (Apache Camel camel-undertow Rest DSL): il binding Rest DSL hard-codifica muteException=false, quindi un muteException=true configurato viene ignorato e l'intero stack trace di un'eccezione non catturata viene restituito al client (CWE-209). Corretto in 4.14.8/4.18.3/4.21.0.
Questo progetto dimostra un problema di divulgazione di informazioni nel consumer Rest DSL di camel-undertow di Apache Camel, tracciato come CVE-2026-56139. L'opzione muteException controlla se il dettaglio di un'eccezione di elaborazione non catturata viene restituito al client HTTP. Su un endpoint undertow semplice l'opzione funziona — ma la Rest DSL di undertow crea il proprio binding di risposta con muteException hard-coded a false e non copia mai il valore configurato, quindi muteException viene silenziosamente ignorato in modalità REST e l'intero stack-trace Java viene comunque restituito:
// 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
}
Poiché undertowHttpBinding dell'endpoint ora non è null, UndertowEndpoint.getUndertowHttpBinding() restituisce quel binding Rest così com'è e non esegue mai il ramo che copia su di esso muteException dell'endpoint. Quindi una route che imposta esplicitamente muteException=true continua a far trapelare gli stack-trace quando viene servita tramite la Rest DSL — divulgando hostname interni del backend, URL di database, indizi su credenziali/vault, versioni delle librerie e posizioni del codice sorgente.
Questa PoC dimostra l'impatto come esposizione di informazioni tramite un messaggio di errore (CWE-209). È la controparte specifica della Rest DSL di CVE-2026-49365 (che ha corretto il default di muteException per gli endpoint semplici camel-netty-http e camel-undertow); entrambe sono state corrette insieme con CAMEL-23651.
Advisory: https://camel.apache.org/security/CVE-2026-56139.html
La correzione fa sì che il percorso Rest DSL copi
endpoint.getMuteException()inRestUndertowHttpBinding, quindi la Rest DSL rispetta l'impostazione (e il default corretto ditrue).
// 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
Esegui l'upgrade a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). Dopo l'upgrade, la Rest DSL di undertow rispetta muteException (e la imposta di default a true), quindi lo stack-trace non viene restituito.
Fino all'upgrade, aggiungi un onException(...).handled(true) (o un gestore di errori globale) che restituisca un messaggio generico invece dello stack-trace, e non fare affidamento sul solo muteException per i consumer della Rest DSL di undertow.
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità pubblicamente divulgata e corretta. Non utilizzarlo contro sistemi senza esplicita autorizzazione.
| Proprietà | Valore |
|---|
| Componente | camel-undertow (consumer Rest DSL) |
| Classe interessata | org.apache.camel.component.undertow.UndertowComponent — crea RestUndertowHttpBinding senza copiare muteException (che quindi di default è false) |
| CWE | CWE-209 (Generazione di un messaggio di errore contenente informazioni sensibili) |
| Impatto | Intero stack-trace Java restituito a un client non autenticato anche quando è configurato muteException=true |
| Prerequisiti | Un consumer undertow Rest DSL; qualsiasi richiesta che innesca un'eccezione di elaborazione |
| Versioni interessate | Dalla 4.0.0 alla 4.14.8 (esclusa), dalla 4.15.0 alla 4.18.3 (esclusa), dalla 4.19.0 alla 4.21.0 (esclusa) |
| Versioni corrette | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Crediti | Yu Bao (PayPal) |