
Рабочий proof-of-concept на Spring Boot для CVE-2026-83531, демонстрирующий инъекцию выражений (expression-language injection) в эндпоинте dynamic-router-control Apache Camel и проверяющий исправление.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой endpoint dynamic-router-control
принимал предикат подписки и имя языка, используемого для его компиляции, из входящего
сообщения (поля predicate / expressionLanguage в DynamicRouterControlMessage либо заголовки
CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). Затем сервис разрешал этот
язык из CamelContext и компилировал выражение в Predicate, без allow-list и без
opt-in. Скомпилированный предикат вычислялся для каждого exchange, маршрутизируемого через канал, — поэтому любой субъект, способный
отправить сообщение в транспорт, маршрут которого пересылает его в control endpoint, мог передать выражение по своему
выбору, вычисляемое с привилегиями процесса Camel. Можно было выбрать любой язык в classpath,
включая simple, который присутствует всегда и был значением по умолчанию.
Только Camel Spring Boot. Расширения
camel-quarkus-dynamic-routerне существует, поэтому этот воспроизводитель нельзя запустить на Camel Quarkus.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (уязвимая версия; исправлено в 4.22.1) |
Приложение настраивает канал Dynamic Router test (direct:start → dynamic-router://test). Атакующий отправляет
control-сообщение subscribe, несущее выбранное атакующим выражение предиката и язык:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
Затем одно сообщение маршрутизируется через канал, который вычисляет предикат подписки. В уязвимой сборке
выражение выполняется, вызывая detonator.detonate() — безвредную замену любого метода реестра без аргументов, до которого
мог бы добраться атакующий (и любой язык, например Groovy, обеспечивает выполнение произвольного кода). В исправленной сборке контрольная
конечная точка отказывается принимать предикат/язык из сообщения.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Ожидаемый вывод на затронутой сборке:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
В исправленной сборке подписка отклоняется с IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| Свойство | Значение |
|---|---|
| Компонент | camel-dynamic-router (endpoint dynamic-router-control) |
| CWE | CWE-94 (внедрение кода), CWE-917 (внедрение выражений языка) |
| Критичность | ВЫСОКАЯ |
| Вектор атаки | Управляющее сообщение (subscribe/update), передающее выражение-предикат и язык, на транспорте, маршрут которого перенаправляет его в endpoint dynamic-router-control |
| Воздействие | Вычисление выбранного атакующим выражения (на любом языке из classpath) с привилегиями процесса Camel — выполнение кода |
| Уязвимые версии | С 4.4.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24576 |
| Благодарность | Leon Zlobecki |
Уведомление: https://camel.apache.org/security/CVE-2026-83531.html
Выражение-предикат и его язык больше не берутся из управляющего сообщения по умолчанию: управляющее сообщение,
которое их передаёт, отклоняется, если автор маршрута явно не включил allowPredicateFromMessage=true на
endpoint dynamic-router-control. Предполагаемый путь — настройка predicate и expressionLanguage в
URI endpoint (под контролем автора маршрута), как это было в версиях до 4.4.0.
Не перенаправляйте сообщения из внешних источников в endpoint dynamic-router-control; управляйте подписками
только через endpoint, контролируемые автором маршрута, и ограничьте транспорты, которые могут достичь
управляющего канала.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Полезная нагрузка представляет собой безвредный маркерный бин. Не используйте этот материал против систем, которыми вы не владеете и не управляете.