
Proof-of-concept репродуктор для обхода аутентификации JWT в Apache Camel (CVE-2026-66908), демонстрирующий отсутствие проверки iss/aud в camel-platform-http-main, с развёртыванием на базе Docker и шагами проверки.
iss/aud не проверяютсяРабочий proof-of-concept для воспроизведения уязвимости Apache Camel, в которой встроенный HTTP-сервер
camel-main строит свой JWT-аутентификатор только на основе хранилища ключей, когда не настроены ни jwtIssuer,
ни jwtAudience, поэтому входящие токены проверяются только по подписи и сроку действия — утверждения iss
и aud никогда не проверяются.
| Среда выполнения | Каталог | Стек |
|---|
| Camel Main (автономный) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
Почему camel-main, а не Camel Spring Boot / Camel Quarkus? Уязвимый класс,
JWTAuthenticationConfigurer, находится вcamel-platform-http-main— встроенном HTTP-сервере camel-main (MainHttpServer), используемом автономными приложениями camel-main иcamel-jbang. Этот сервер — не интеграция platform-http из Camel Spring Boot (на сервлетах) и не вариант Camel Quarkus (HTTP на Quarkus/Vert.x с собственной безопасностью), поэтому для данного конкретного дефекта не существует точного воспроизведения на Spring Boot или Quarkus. Поэтому в этом репозитории представлен автономный репро-репозиторий на базе camel-main, что и является точной средой для данной ошибки.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
Ожидаемый вывод на затронутой сборке:
[1] GET /protected with NO token -> HTTP 401 (auth is enforced)
[2] GET /protected with token iss=https://attacker.example aud=some-unrelated-service -> HTTP 200 (ACCEPTED — iss/aud NOT validated)
[3] GET /protected with the same token but EXPIRED -> HTTP 401 (expiry IS checked)
>>> PROVEN: ... the iss and aud claims were never checked ... : true
| Свойство | Значение |
|---|---|
| Компонент | camel-platform-http-main (встроенный HTTP-сервер camel-main) |
| CWE | CWE-287 (некорректная аутентификация) / CWE-1259 (отсутствие проверки утверждений безопасности) |
| Вектор атаки | JWT, подписанный доверенным ключом (например, общим JWKS), но выпущенный для другого эмитента/аудитории |
| Воздействие | Принимается любой неистёкший токен от любой стороны, имеющей доступ к тому же подписывающему ключу, — развёртывание обеспечивает более слабую проверку, чем рассчитывает оператор |
| Затронутые версии | С 4.8.0 до 4.22.0 |
| Исправленные версии | 4.22.0 |
| JIRA | CAMEL-24281 |
| Автор | n0mi1k |
Рекомендация: https://camel.apache.org/security/CVE-2026-66908.html
Начиная с версии 4.22.0 сервер отказывается запускаться, если настроено хранилище ключей JWT, но не заданы
ни jwtIssuer, ни jwtAudience, и при этом указывает, какие свойства отсутствуют. Оператор, которому
действительно нужна проверка только подписи и срока действия, должен явно включить эту возможность параметром
camel.server.jwtAllowMissingIssuerAndAudience=true (по умолчанию — fail-closed):
// fixed (JWTAuthenticationConfigurer.assertIssuerOrAudienceConfigured)
if (ObjectHelper.isEmpty(audience) && ObjectHelper.isEmpty(issuer)) {
throw new IllegalArgumentException(
"JWT authentication requires camel.server.jwtIssuer or camel.server.jwtAudience to be configured, ...");
}
Этот репозиторий опубликован в образовательных и защитных целях: помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет её. Токены выпускаются локально с использованием одноразового демонстрационного хранилища ключей, входящего в проект. Не используйте эти материалы против систем, которыми вы не владеете и не управляете.