
Работоспособный воспроизводитель proof-of-concept для CVE-2026-85315, демонстрирующий раскрытие сообщений об исключениях потребителя camel-grpc (CWE-209) в Camel Spring Boot и Quarkus.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой, если маршрут за gRPC-потребителем
завершался с ошибкой, сообщение исключения маршрута копировалось в описание Status gRPC. В отличие от причины статуса
(withCause(...)), которая остаётся локальной для сервера, описание передаётся вызывающему клиенту, поэтому
внешний вызывающий, способный спровоцировать сбой, мог прочитать внутреннее сообщение об ошибке — на практике имена классов и пакетов,
пути к файлам, имена хостов и сведения о соединении, содержащиеся в сообщениях исключений (CWE-209). Это gRPC-представитель
того же семейства уязвимостей с неотфильтрованными исключениями потребителя, что и опубликованные вместе с ним рекомендации для knative, mina и CXF.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0, уязвим; контроль с исправлением CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют уязвимое и исправленное поведение на реальном gRPC-потребителе camel-grpc.
Каждый модуль запускает gRPC-потребителя camel-grpc (сервис PingPong из собственного тестового proto camel-grpc), маршрут которого всегда
завершается с ошибкой, содержащей сообщение, похожее на внутреннее:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
Эндпоинт верификатора /exploit/attack играет роль внешнего gRPC-клиента: он вызывает PingSyncSync, перехватывает
StatusRuntimeException и сообщает код Status и описание, которые вернул сервер.
muteException по умолчанию имеет значение true, поэтому описание
становится общим "Exchange processing failed", а реальное сообщение никогда не покидает сервер (оно сохраняется
только в локальной причине статуса).# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> 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.22.0): description leaks the internal message
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: description is "Exchange processing failed"
Каждый модуль обслуживает верификатор на 8080 и запускает consumer camel-grpc на 50051 в рамках одного процесса; публикуется только
8080.
| Свойство | Значение |
|---|---|
| Компонент | camel-grpc (GrpcMethodHandler, consumer) |
| CWE | CWE-209 (Генерация сообщения об ошибке, содержащего конфиденциальную информацию) |
| Критичность | СРЕДНЯЯ |
| Вектор атаки | Внешний gRPC-клиент вызывает сбой маршрута и читает переданное описание Status |
| Воздействие | Внутренние детали ошибки (имена классов/пакетов, пути, имена хостов, сведения о соединении) раскрываются вызывающей стороне |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24478 |
| Благодарность | Claude Security Scan Tool |
Уведомление: https://camel.apache.org/security/CVE-2026-85315.html
Затронутый модуль Quarkus собран на CQ 3.39.0 (Camel 4.22.0). Исправленный контроль — CQ 3.40.0 (Camel 4.22.1).
GrpcMethodHandler добавляет опцию consumer muteException (по умолчанию
true). Когда она включена, неудачный обмен возвращает в переданном статусе общее описание "Exchange processing failed";
исключение маршрута по-прежнему прикрепляется локально через withCause(...), которое gRPC не отправляет
клиенту. Установите muteException=false на endpoint, чтобы восстановить прежнее поведение.
Сопоставляйте сбои с явным статусом в обработчике onException, чтобы фреймворк никогда не копировал сообщение исключения
в описание.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять
уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. «Внутреннее» сообщение — это
безобидная заглушка (db.internal.local, svc_admin), и вся демонстрация выполняется в одном процессе. Не используйте этот
материал против систем, которыми вы не владеете и не управляете.