
PoC-репродукторы для инъекции заголовков MimeMultipart в Apache Camel camel-mail (CVE-2026-59230), демонстрирующие SSRF через инъекцию CamelHttpUri в средах выполнения Spring Boot и Quarkus.
MimeMultipart: внедрение заголовков (headersInline)Готовые к запуску proof-of-concept репроducers для одной и той же уязвимости Apache Camel, по одному на каждый рантайм:
| Среда выполнения | Каталог | Стек |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (включает Camel 4.20.0) |
Обе версии — затронутые (проблема исправлена в 4.14.9 / 4.18.4 / 4.22.0), и обе демонстрируют один и тот же
дефект: формат данных camel-mail MimeMultipart при unmarshalling с headersInline=true копирует каждый
нестандартный MIME-заголовок входящего сообщения в Camel Exchange через setHeader без применения какого-либо
HeaderFilterStrategy. Имена MIME-заголовков берутся из недоверенного тела, поэтому отправитель может поместить заголовок во внутреннее
пространство имён Camel (например, CamelHttpUri) и добиться его установки на Exchange — даже после того, как маршрут удалил
заголовки Camel* на HTTP-границе. Затем нижестоящий компонент читает внедрённый управляющий заголовок (внедрение
заголовка → CWE-74).
В этих репроducers внедрённый CamelHttpUri перенаправляет нижестоящий HTTP-producer с предполагаемого
/legit-backend на внутренний /internal/secret endpoint (SSRF), наглядно возвращая внутренние данные.
Каждый подкаталог — самостоятельный проект со своими Dockerfile, docker-compose.yml и README с
полными подробностями и шагами воспроизведения. Если кратко, для любого из них:
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 MIME (no injected header):
/ingest responded: LEGIT: your message was accepted
2) Malicious MIME (injected MIME header 'CamelHttpUri: http://localhost:8080/internal/secret'):
/ingest responded: SECRET: internal_db_password=S3cr3t-INTERNAL-9f2a
>>> PROVEN: ... redirecting the HTTP producer to an internal service (SSRF): true
| Свойство | Значение |
|---|---|
| Компонент | camel-mail — формат данных MimeMultipart (Spring Boot: camel-mail-starter; Quarkus: camel-quarkus-mail) |
| CWE | CWE-20 (некорректная проверка входных данных) → CWE-74 (внедрение) |
| Вектор атаки | Специально сформированное MIME multipart-тело, разобранное (unmarshalled) с headersInline=true |
| Воздействие | Внедрение внутренних управляющих заголовков Camel в Exchange (здесь: CamelHttpUri → SSRF) |
| Затронутые версии | С 2.17.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-23891 |
| Авторство | Atuin — Automated Vulnerability Discovery Engine, anciety из Tencent Xuanwu Lab |
Рекомендация: https://camel.apache.org/security/CVE-2026-59230.html
MimeMultipartDataFormat.copyNonStandardHeaders теперь пропускает каждый входящий MIME-заголовок через
MailHeaderFilterStrategy перед установкой его на Exchange, что согласуется с входящей фильтрацией, которую
mail-consumer уже применяет, — поэтому заголовки Camel* из недоверенного тела отбрасываются, а не копируются дословно:
// fixed
if (headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(),
camelMessage.getExchange())) {
continue; // filtered
}
camelMessage.setHeader(header.getName(), header.getValue());
Этот репозиторий опубликован в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет её. Пейлоады безвредны (перенаправление на локальный endpoint). Не используйте этот материал против систем, которыми вы не владеете и которые не администрируете.