
PoC-репродуктор для инъекции заголовка диспетчеризации Apache Camel camel-atmosphere-websocket (CVE-2026-71300), демонстрирующий, как внедрённый заголовок может перенаправлять WebSocket-сообщения получателю, выбранному атакующим.
Рабочий proof-of-concept репродуктор уязвимости Apache Camel, в которой производитель camel-atmosphere-websocket выбирает получателей WebSocket из заголовков Exchange websocket.*, имена которых находятся вне пространства имён Camel — поэтому HTTP HeaderFilterStrategy (который удаляет только Camel* / camel*) пропускает их, и внешний отправитель может перехватить решение производителя о диспетчеризации.
| Среда выполнения | Каталог | Стек |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus: расширения
camel-quarkus-atmosphere-websocketне существует, поэтому этот компонент нельзя запустить на Camel Quarkus — репродуктор работает только на Spring Boot.
Маршрут соединяет HTTP-потребитель с производителем atmosphere-websocket, доставляя каждое HTTP-сообщение одному закреплённому получателю WebSocket («жертве») путём установки самого заголовка websocket.connectionKey. Но WebsocketProducer.process проверяет списочный заголовок websocket.connectionKey.list раньше, чем заголовок с одним ключом, и это точечное имя не входит в пространство имён Camel, поэтому HTTP-фильтр заголовков не удаляет его. Инжектированный заголовок websocket.connectionKey.list таким образом проходит из запроса в Exchange и переопределяет закреплённого получателя — сообщение, предназначенное жертве, доставляется на выбранное атакующим соединение вместо этого.
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
О тестовом стенде. Среда выполнения atmosphere WebSocket нуждается в обновлении WebSocket сервлетного контейнера и собственной инициализации фреймворка, которые невозможно запустить из обычного автономного приложения Spring Boot. Поэтому этот репродуктор задействует реальную логику диспетчеризации
WebsocketProducerчерез реальный HTTP-вход — только два подключённых пира являются заглушками, зарегистрированными напрямую вWebSocketStoreконечной точки (как atmosphere-фреймворк зарегистрировал бы реальные браузерные соединения). Обход фильтра заголовков и приоритет диспетчеризации производителя — сама уязвимость — проверяются по-настоящему.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Ожидаемый вывод на уязвимой сборке:
1) Benign POST /notify (no injected header):
victim received: [hello for the victim]
attacker received: []
2) Injected POST /notify with header 'websocket.connectionKey.list: attacker-connection-key':
victim received: []
attacker received: [private data meant for the victim, ...]
>>> PROVEN: ... delivering a message meant for the victim to an attacker-chosen WebSocket connection instead: true
| Свойство | Значение |
|---|---|
| Компонент | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (Некорректная проверка входных данных) → CWE-74 (Инъекция) |
| Вектор атаки | Инжектированный заголовок websocket.connectionKey.list (или websocket.connectionKey / websocket.sendToAll) в запросе, направляемом в производитель atmosphere-websocket |
| Воздействие | Перехват решения производителя о диспетчеризации — доставка произвольным пирам WebSocket или удержание сообщений от них |
| Затронутые версии | С 4.0.0 до 4.14.9, с 4.15.0 до 4.18.4, с 4.19.0 до 4.22.0 |
| Исправленные версии | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| Автор | Barak Srour (Apiiro) |
Константы заголовков диспетчеризации были переименованы в пространство имён Camel — CamelAtmosphereWebsocketConnectionKey, CamelAtmosphereWebsocketConnectionKeyList, CamelAtmosphereWebsocketSendToAll — поэтому HTTP HeaderFilterStrategy удаляет их на транспортной границе, и внешний отправитель больше не может их инжектировать. Связанный путь WebSocket в camel-undertow рассматривается в CVE-2026-78329.
Этот репозиторий опубликован в образовательных и защитных целях: помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и подтвердить, что обновление устраняет её. Не используйте этот материал против систем, которыми вы не владеете и которые не эксплуатируете.