
Рабочий воспроизводитель на Spring Boot для CVE-2026-85246, демонстрирующий раскрытие исключений потребителя camel-mina через сокет и проверяющий исправление muteException.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой потребитель Mina записывал
exchange.getException() напрямую обратно в сокет удалённому узлу при сбое обработки обмена.
Через textline-кодек это передаёт узлу имя класса и сообщение исключения; через объектный кодек передаётся
сериализованное исключение, включая цепочку причин. Удалённый узел, способный спровоцировать сбой, мог прочитать внутренние
детали о развёртывании — имена классов и пакетов, а также всё, что несёт сообщение или вложенная причина, что
на практике включает пути, имена хостов и сведения о соединении. У потребителя не было возможности подавить это, в отличие от
потребителей семейства HTTP, согласованных в CAMEL-23651.
Только Spring Boot. Расширения
camel-quarkus-minaне существует, поэтому этот воспроизводитель поставляется с единственным модулем Camel Spring Boot. (Дефект находится вMinaConsumerкомпонента, который не зависит от среды выполнения.)
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (уязвим; исправлено в 4.22.1) |
Потребитель Mina TCP (sync=true, textline=true) обрабатывает каждую входящую строку и завершается с ошибкой — олицетворяя любой маршрут,
который сталкивается с внутренней ошибкой. Маршрут выбрасывает IllegalStateException, сообщение которого несёт симулированные внутренние
детали (поддельный путь к конфигурации /etc/camel/secret.properties, поддельный хост и маркерный токен). Драйвер эксплойта — это
обычный удалённый TCP-узел: он открывает сокет, отправляет одну строку и читает ответ, который потребитель записывает обратно.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed — без класса, сообщения или трассировки стека
исключения маршрута — при этом ответ всё равно отправляется, чтобы синхронный узел не оставался в ожидании тайм-аута.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| Свойство | Значение |
|---|---|
| Компонент | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (Генерация сообщения об ошибке, содержащего конфиденциальную информацию) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Удалённый TCP/UDP-пир провоцирует сбой маршрута и читает исключение из ответа, записанного обратно в сокет |
| Воздействие | Раскрытие информации: класс/сообщение исключения через textline-кодек либо сериализованное исключение + цепочка причин через object-кодек (внутренние имена хостов, пути, сведения о соединении) |
| Уязвимые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24476 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85246.html
MinaConsumer добавляет опцию потребителя muteException (по умолчанию true).
Когда она включена, неудачный обмен больше не записывает exchange.getException() обратно; вместо этого записывается
заглушка Exception("Exchange processing failed") с пустой трассировкой стека — по-прежнему Exception (так что пир
с object-кодеком всё равно её получит), но без класса, сообщения или кадров исключения маршрута. Ответ всё равно
записывается, чтобы синхронный пир не остался ждать до тайм-аута. Установите muteException=false, чтобы вернуть
прежнее поведение.
Добавьте обработчик onException, который явно задаёт тело ответа, чтобы фреймворк никогда не записывал исключение
обратно пиру.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Путь к конфигурации, хост и маркерный токен в сбойном маршруте являются инертными вымышленными локальными фикстурами. Не используйте этот материал против систем, которыми вы не владеете и не управляете.