
Запускаемый proof-of-concept на Spring Boot, воспроизводящий CVE-2026-85317, где кэш OAuth2-токенов в camel-http игнорирует scope, resource и token endpoint, а также исправленный контрольный вариант.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой кэш токенов OAuth2-клиента camel-http
— глобальная для JVM static-карта — формировал ключи своих записей только по (uri, clientId, clientSecret), опуская поля,
которые фактически определяют токен: запрошенную область (scope), индикатор ресурса и конечную точку токена. Две
конечные точки, различающиеся только этими полями, поэтому совместно использовали одну запись кэша, так что конечной точке мог быть выдан токен, выпущенный
для другой области, другого ресурса или другим сервером авторизации — запрос, несущий
более широкие полномочия, чем те, на которые была настроена конечная точка, или токен, предъявленный стороне, для которой он не был выпущен
(CWE-524).
Только Spring Boot. Этот воспроизводитель поставляется с единственным модулем Camel Spring Boot. Дефект находится в OAuth2-клиенте
camel-http, который также имеет расширениеcamel-quarkus-http; но в JVM-упаковке этого расширения параметры клиентаoauth2*уровня конечной точки не применяются так, как под Spring Boot (перехватчик OAuth2-запросов, владеющий кэшем токенов, не подключается, поэтому конечная точка токена никогда не вызывается) — то же ограничение, задокументированное для CVE-2026-85251. Модуль Spring Boot демонстрирует как уязвимое, так и исправленное поведение.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (уязвимая; исправлено в 4.22.1) |
Драйвер повторяет собственный регрессионный тест исправления (HttpOAuth2TokenCachingTest). Два одноразовых HTTP-сервера работают внутри
процесса: конечная точка токена, которая выпускает bearer-токен, и цель, которая его требует. Верификатор
(/exploit/attack):
oauth2CacheTokens=true&oauth2Scope=read — токен выпускается и кэшируется;oauth2Scope=read+write.read —
он успешен, даже несмотря на то, что конечная точка токена недоступна (свежий токен в принципе не мог быть выпущен).HttpHostConnectException).cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: 2nd request 200 (reused read token); >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85317-http-oauth2-token-cache-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 2nd request HttpHostConnectException; >>> Not exploited
| Свойство | Значение |
|---|---|
| Компонент | camel-http (OAuth2ClientConfigurer, кэш токенов) |
| CWE | CWE-524 (Использование кэша, содержащего конфиденциальную информацию) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | В развёртывании настроено более одной конечной точки OAuth2, различающихся только scope, индикатором ресурса или конечной точкой токена; они совместно используют глобальный для JVM кэш токенов |
| Воздействие | Конечной точке выдаётся токен, выпущенный для другого scope/ресурса/сервера авторизации — с более широкими полномочиями, чем настроено, либо токен предъявляется не той стороне |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24456 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85317.html
OAuth2ClientConfigurer расширяет запись ключа кэша
OAuth2URIAndCredentials, включая в неё конечную точку токена, scope и индикатор ресурса, поэтому записи больше не
разделяются между конечными точками, различающимися по любому из этих полей.
Запускайте конечные точки, различающиеся по scope, индикатору ресурса или конечной точке токена, в отдельных JVM, чтобы они не использовали общий статический кэш.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять
уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Токен
(xxx.yyy.zzz), client id и secret являются безвредными заполнителями, а оба HTTP-сервера работают в рамках одного
процесса. Не используйте этот материал против систем, которыми вы не владеете и которые не эксплуатируете.