
Рабочий воспроизводитель proof-of-concept для обхода проверки издателя camel-keycloak в Apache Camel (CWE-287), демонстрирующий уязвимое и исправленное поведение в Spring Boot и Quarkus.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой KeycloakSecurityProcessor из camel-keycloak
проверял издателя интроспектированного токена только когда ответ интроспекции
действительно содержал утверждение iss. Когда утверждение отсутствовало, проверка пропускалась, а не рассматривалась как
ошибка, поэтому токен, выпущенный не настроенным издателем, мог быть принят — при условии, что эндпоинт интроспекции
ответил active, не указав издателя. В случае, когда развёртывание выполняет интроспекцию через эндпоинт, который опускает iss и
обслуживает более одного издателя, следствием является то, что оно аутентифицирует вызывающую сторону, которую должно было отклонить (CWE-287).
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0 (уязвимая; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak (Camel 4.22.0, уязвимая; исправленный контроль CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют уязвимое и исправленное поведение на реальном KeycloakSecurityProcessor.
Драйвер настраивает KeycloakSecurityPolicy с validateIssuer=true (ожидаемый издатель
http://localhost:8080/realms/test-realm) и интроспектором токенов, который сообщает, что токен активен, но возвращает
без утверждения iss — именно то, что выдаёт эндпоинт интроспекции брокера/шлюза, поскольку RFC 7662 делает iss
необязательным. Затем он управляет KeycloakSecurityProcessor с заголовком Authorization: Bearer <attacker-token> и
сообщает, достигнут ли защищённый маршрут.
iss заставляет процессор пропустить проверку издателя, поэтому токен принимается и
маршрут достигается — токен от непредусмотренного издателя аутентифицируется.iss является ошибкой валидации; процессор выбрасывает CamelAuthorizationException
("Token issuer missing…"), и маршрут никогда не достигается.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): route reached, token accepted
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"
| Свойство | Значение |
|---|---|
| Компонент | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (Некорректная аутентификация) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Токен от непредусмотренного эмитента, прошедший интроспекцию на эндпоинте, который опускает iss и обслуживает более одного эмитента, при validateIssuer=true |
| Воздействие | Развёртывание аутентифицирует вызывающую сторону, чей токен не был выпущен настроенным эмитентом |
| Затронутые версии | С 4.15.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24448 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85301.html
Затронутый модуль Quarkus построен на CQ 3.39.0 (Camel 4.22.0), где
camel-quarkus-keycloakсоответствует затронутой версии Camel. Исправленный элемент управления — CQ 3.40.0 (Camel 4.22.1).
KeycloakSecurityProcessor теперь рассматривает отсутствующее утверждение iss как
ошибку валидации: когда валидация эмитента включена и результат интроспекции не содержит эмитента, он выбрасывает
CamelAuthorizationException вместо того, чтобы завершиться досрочно и пропустить запрос. Прежний код пропускал
сравнение всякий раз, когда утверждение отсутствовало, что оставляло эмитента непроверенным именно для тех токенов, которые не указывали
эмитента.
Убедитесь, что эндпоинт интроспекции возвращает утверждение iss и обслуживает ровно одного эмитента, чтобы токен от любого другого
эмитента либо был именован (и отклонён), либо никогда не проходил интроспекцию как активный.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Интроспектор токенов представляет собой внутрипроцессную заглушку, и никакой реальный сервер Keycloak или сетевой вызов не задействован; «токен атакующего» — это непрозрачная строка-заполнитель. Не используйте этот материал против систем, которыми вы не владеете и которые не эксплуатируете.