
Рабочий proof-of-concept для CVE-2026-80343 — обхода проверки безопасности camel-netty-http из-за регистрозависимости, с воспроизведением на Spring Boot и Quarkus и проверкой исправления.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой ограничение безопасности camel-netty-http сравнивало путь запроса с настроенным контекстным путём с использованием регистрозависимого сопоставления, тогда как маршрутизация, направляющая запрос к эндпоинту, не применяла то же правило. Эти два сравнения расходятся для любого пути, регистр которого отличается от настроенного значения: внешний вызывающий может изменить регистр символа в сегменте контекстного пути так, что ограничение безопасности больше не распознаёт путь как защищённый, при этом запрос всё равно направляется к тому же эндпоинту. Ограничение пропускается, и защищённый маршрут достигается без его выполнения — не требуется ни учётных данных, ни предварительного доступа, ни специальной конфигурации.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-netty-http 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-netty-http 3.29.0 (Camel 4.15.0, уязвим; исправлено в контрольной версии 3.40.0 / Camel 4.22.1) |
Потребитель netty-http прослушивает контекстный путь /app и защищён SecurityConstraintMapping, который защищает /secret (относительно эндпоинта) с помощью отклоняющего аутентификатора. Оба запроса ниже не содержат учётных данных:
GET /app/secret (настроенный регистр) → ограничение распознаёт его как защищённый → 401.GET /App/secret (регистр контекстного пути изменён) → extractTarget обработчика удаляет контекстный путь только при регистрозависимом startsWith, поэтому удаление пропускается, и ограничение не распознаёт путь как защищённый → маршрутизатор всё равно направляет его к эндпоинту /app → 200 и защищённое тело, без аутентификации.На исправленной сборке оба запроса возвращают 401.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Ожидаемый вывод на уязвимой сборке:
Configured case GET /app/secret -> status 401, body:
Altered case GET /App/secret -> status 200, body: PROTECTED-ADMIN-DATA: reached the protected endpoint
>>> PROVEN: /app/secret is correctly rejected (401), but /App/secret bypassed the security constraint ...
| Свойство | Значение |
|---|---|
| Компонент | camel-netty-http |
| CWE | CWE-178 (Некорректная обработка регистрозависимости) |
| Критичность | ВЫСОКАЯ |
| Вектор атаки | Запрос, регистр контекстного пути которого отличается от настроенного пути эндпоинта |
| Воздействие | Ограничение безопасности пропускается; защищённый маршрут достигается без аутентификации |
| Уязвимые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24412 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-80343.html
Ограничение безопасности и обработка контекстного пути теперь сравнивают путь согласованно (без учёта регистра для контекстного пути), поэтому запрос с изменённым регистром распознаётся как защищённый точно так же, как его форма с настроенным регистром, и подлежит той же аутентификации.
Обеспечьте авторизацию в самом маршруте, а не полагайтесь исключительно на ограничение безопасности netty-http, или нормализуйте регистр пути запроса перед проверкой безопасности, пока не сможете обновиться.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Не используйте этот материал против систем, которыми вы не владеете и которые не эксплуатируете.