
PoC-репродукторы инъекции заголовков структурированных CloudEvent в Apache Camel camel-knative (CVE-2026-63621), демонстрирующие внедрение заголовков через вредоносные поля расширений в средах выполнения Spring Boot и Quarkus.
Готовые к запуску proof-of-concept репродукторы для одной и той же уязвимости Apache Camel, по одному для каждой среды выполнения:
| Среда выполнения | Каталог | Стек | Стиль |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | прямое декодирование (см. примечание) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (включает Camel 4.20.0) | полноценный HTTP-управляемый источник knative |
Обе — затронутые версии (проблема исправлена в 4.14.9 / 4.18.4 / 4.22.0), и обе демонстрируют один и тот же дефект: потребитель camel-knative принимает CloudEvents в двух режимах содержимого. В двоичном режиме атрибуты приходят как HTTP-заголовки и пропускаются через HeaderFilterStrategy, поэтому заголовки Camel* отбрасываются. В структурированном режиме (Content-Type: application/cloudevents+json) всё событие — это JSON-тело, и затронутая сборка сопоставляет каждое поле расширения этого JSON с заголовками сообщения через setHeader(key.toLowerCase(Locale.US), value) и без HeaderFilterStrategy. Имена расширений выбираются отправителем, поэтому атакующий может задать внутренний управляющий заголовок Camel. Здесь внедрённое расширение camelsqlquery становится заголовком CamelSqlQuery (заголовки Camel нечувствительны к регистру) — оператором, который выполнил бы продюсер camel-sql (внедрение заголовка → CWE-74).
Примечание о варианте Spring Boot. Транспорт HTTP в knative основан на Vert.x и используется в развёртываниях camel-main / Camel Quarkus. Сервлетное приложение Spring Boot не включает этот транспорт, поэтому репродуктор на Spring Boot напрямую запускает точное уязвимое декодирование (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) — тот же путь выполнения, который проходит входящий запросapplication/cloudevents+jsonвнутри потребителя knative. Вариант на Camel Quarkus — это полноценный HTTP-управляемый репродуктор (POST CloudEvent в живой источник).
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Ожидаемый результат на затронутой сборке (оба варианта):
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
| Свойство | Значение |
|---|---|
| Компонент | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (Некорректная проверка входных данных) → CWE-74 (Инъекция) |
| Вектор атаки | Структурированный CloudEvent (application/cloudevents+json) с выбранным атакующим полем расширения |
| Воздействие | Инъекция внутренних управляющих заголовков Camel в Exchange (здесь CamelSqlQuery) |
| Затронутые версии | с 3.15.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-24084 |
| Автор | Andrea Cosentino (Apache Software Foundation) |
Рекомендация: https://camel.apache.org/security/CVE-2026-63621.html
Теперь при сопоставлении расширений в структурированном режиме каждое поле пропускается через HeaderFilterStrategy (DefaultHeaderFilterStrategy) перед установкой, как и в пути двоичного режима, — поэтому имена расширений Camel* из недоверенного тела отбрасываются:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
Этот репозиторий опубликован в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и подтвердить, что обновление устраняет её. Внедрённое значение — безвредная метка (инертная SQL-строка, которая здесь никогда не выполняется). Не используйте этот материал против систем, которыми вы не владеете и не управляете.