
Работающий пример воспроизведения на Spring Boot и Quarkus для CVE-2026-85257, демонстрирующий раскрытие информации в SOAP-ошибках camel-cxf и проверяющий исправление muteException.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой, если маршрут за CXF SOAP consumer завершался с исключением, которое не объявлено в контракте сервиса, описание исключения возвращалось SOAP-клиенту в fault: CXF копирует сообщение в SOAP faultstring (и может быть настроен на помещение трассировки стека в fault detail). Внешний вызывающий, способный спровоцировать сбой, мог таким образом прочитать внутренние сведения о развёртывании — имена классов и пакетов, а также всё, что содержит сообщение исключения. Объявленные faults (аннотированные @WebFault) — это другое дело: они являются частью опубликованного контракта, под который пишутся клиенты, поэтому по-прежнему сообщаются полностью.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (уязвим; исправлено в 4.22.1), CXFServlet на Tomcat |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0, уязвим; контрольное исправление CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют как уязвимое, так и исправленное поведение.
CXF SOAP consumer обслуживает маршрут, процессор которого выбрасывает необъявленное IllegalStateException, несущее смоделированные внутренние сведения (маркерный токен и поддельный внутренний JDBC URL). Драйвер выступает в роли SOAP-клиента: он вызывает сервис и читает возвращённый ему SOAP fault.
Exchange processing failed — и не содержит ни класса, ни сообщения, ни трассировки стека исключения маршрута (новая опция consumer muteException по умолчанию равна true). Fault, объявленный контрактом (@WebFault), по-прежнему возвращался бы полностью.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): fault leaks internal detail
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault
| Свойство | Значение |
|---|---|
| Компонент | camel-cxf (CxfConsumer, формирование SOAP fault) |
| CWE | CWE-209 (Генерация сообщения об ошибке, содержащего конфиденциальную информацию) |
| Критичность | MEDIUM |
| Вектор атаки | Вызывающий SOAP-клиент провоцирует незадекларированный сбой маршрута и читает детали исключения из fault |
| Воздействие | Раскрытие информации: класс/сообщение исключения (внутренние имена хостов, строки подключения, структура маршрута) попадают к внешнему SOAP-клиенту |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24477 |
| Благодарность | Claude Security Scan Tool |
Уведомление: https://camel.apache.org/security/CVE-2026-85257.html
Модуль Spring Boot монтирует CXFServlet на встроенном Tomcat (отдельный транспорт CXF Jetty конфликтует с версией Jetty, управляемой Spring Boot), поэтому SOAP-эндпоинт обслуживается по адресу
/services/helloна порту 8080.
CxfConsumer добавляет опцию потребителя muteException (по умолчанию true).
Для незадекларированного сбоя маршрута он теперь формирует fault из подставного Exception("Exchange processing failed")
с пустой трассировкой стека вместо исключения маршрута — так что ни имя класса, ни сообщение, ни трассировка стека не попадают к
вызывающему. Исключение, объявленное в контракте (@WebFault), обнаруживается и сообщается полностью, поскольку его подавление
нарушило бы работу сервиса. Установите muteException=false, чтобы восстановить прежнее поведение.
Объявите исключения, о которых сервису разрешено сообщать, и сопоставьте любой другой сбой с одним из них в
обработчике onException, чтобы ни одно незадекларированное исключение не попадало в fault.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Маркерный токен и JDBC URL в сбойном маршруте — это инертные вымышленные локальные фикстуры. Не используйте этот материал против систем, которыми вы не владеете и не управляете.