
Запускаемое proof-of-concept на Spring Boot, воспроизводящее CVE-2026-85313, где Apache Camel camel-jetty enableCORS отражает любой origin с учётными данными, плюс контрольная версия с исправлением.
enableCORS предоставляет доступ с учётными данными с любого originЗапускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой установка enableCORS=true на endpoint Jetty
приводила к установке CrossOriginFilter из Jetty с его стандартными настройками по умолчанию — которые отражают любой origin и
разрешают учётные данные. Оператор, который всего лишь запросил CORS, получал политику, позволяющую странице с любого origin выполнять
аутентифицированные кросс-доменные запросы к endpoint и читать ответы. Отражённый origin вместе с
Access-Control-Allow-Credentials: true — это в точности конфигурация с учётными данными для любого origin, которую стандарт Fetch
не позволяет выразить через * — отражение является обычным способом обойти это правило (CWE-942).
Только Spring Boot. Этот воспроизводитель содержит единственный модуль Camel Spring Boot. Дефект находится в
camel-jetty, который встраивает HTTP-сервер Jetty. В Camel Quarkus нет расширенияcamel-quarkus-jetty— Quarkus обслуживает HTTP через Vert.x (platform-http) — поэтому аналога для Quarkus не существует. (Сопутствующий advisory CVE-2026-85316 охватывает тот же класс дефекта вplatform-http-vertx.) Модуль Spring Boot демонстрирует как уязвимое, так и исправленное поведение.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (уязвимая; исправлено в 4.22.1), Jetty 12.1.11 |
В одном процессе работают два сервера Jetty: уязвимый endpoint /protected (порт 8081) объявлен с
enableCORS=true, а проверяющий endpoint /exploit/attack (порт 8080) играет роль браузера атакующего. При каждом вызове
проверяющий отправляет кросс-доменный GET к /protected с заголовком Origin: https://evil.example — origin, который
развёртывание никогда не авторизовывало — и сообщает о возвращённых заголовках CORS.
Access-Control-Allow-Origin: https://evil.example и возвращает
Access-Control-Allow-Credentials: true — любой origin может читать ответы с учётными данными.Access-Control-Allow-Credentials больше не отправляется для origin, который оператор не указал.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: ACAO reflected + ACAC: true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85313-jetty-cors-credentials-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: ACAO reflected, ACAC absent; >>> Not exploited
| Свойство | Значение |
|---|---|
| Компонент | camel-jetty (JettyHttpComponent, enableCORS) |
| CWE | CWE-942 (Разрешающая междоменная политика с недоверенными доменами) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Страница с любого origin отправляет междоменный запрос с учётными данными к эндпоинту, настроенному только с enableCORS=true |
| Воздействие | Эндпоинт отражает origin атакующего и предоставляет учётные данные, поэтому страница атакующего может читать аутентифицированные ответы |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24450 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85313.html
JettyHttpComponent теперь применяет собственные настройки CORS по умолчанию, когда задан enableCORS: allowCredentials по умолчанию имеет значение false, если оператор не настроил его явно. Отражение origin остаётся без изменений, поэтому включение CORS продолжает работать для запросов без учётных данных; оператор, которому нужны междоменные запросы с учётными данными, задаёт filterInit.allowCredentials=true и должен указать origin в filterInit.allowedOrigins (и получает предупреждение, если этого не сделает).
Настройте параметры CrossOriginFilter явно, вместо того чтобы полагаться на то, что устанавливает enableCORS — укажите разрешённые origin в filterInit.allowedOrigins и не включайте filterInit.allowCredentials, если вы их не указали.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Origin «атакующего» — это безвредная заглушка (https://evil.example), а и эндпоинт, и проверка выполняются внутри воспроизводителя. Не используйте этот материал против систем, которыми вы не владеете и не управляете.