
Reprodutores de prova de conceito para injeção de cabeçalho MimeMultipart do Apache Camel camel-mail (CVE-2026-59230), demonstrando SSRF via injeção de CamelHttpUri nos runtimes Spring Boot e Quarkus.
MimeMultipart do camel-mail (headersInline)Reprodutores de prova de conceito executáveis para a mesma vulnerabilidade do Apache Camel, um por runtime:
| Runtime | Diretório | Stack |
|---|
| 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 (bundles Camel 4.20.0) |
Ambas são versões afetadas (o problema é corrigido em 4.14.9 / 4.18.4 / 4.22.0), e ambas demonstram o mesmo defeito: o formato de dados MimeMultipart do camel-mail, ao fazer unmarshalling com headersInline=true, copia cada cabeçalho MIME não padrão da mensagem recebida para o Exchange do Camel via setHeader sem aplicar nenhum HeaderFilterStrategy. Os nomes dos cabeçalhos MIME vêm do corpo não confiável, então um remetente pode colocar um cabeçalho no namespace interno do Camel (por exemplo, CamelHttpUri) e fazer com que ele seja definido no Exchange — mesmo depois que a rota removeu os cabeçalhos Camel* na fronteira HTTP. Um componente downstream então lê o cabeçalho de controle injetado (injeção de cabeçalho → CWE-74).
Nesses reprodutores, o CamelHttpUri injetado redireciona o produtor HTTP downstream do /legit-backend pretendido para um endpoint interno /internal/secret (SSRF), retornando visivelmente dados internos.
Cada subdiretório é um projeto independente com seu próprio Dockerfile, docker-compose.yml e README com detalhes completos e etapas de reprodução. Em resumo, para qualquer um:
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
Saída esperada em uma build afetada:
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
| Propriedade | Valor |
|---|---|
| Componente | camel-mail — formato de dados MimeMultipart (Spring Boot: camel-mail-starter; Quarkus: camel-quarkus-mail) |
| CWE | CWE-20 (Validação de Entrada Incorreta) → CWE-74 (Injeção) |
| Vetor de ataque | Um corpo MIME multipart manipulado desserializado com headersInline=true |
| Impacto | Injeção de cabeçalhos de controle internos do Camel no Exchange (aqui: CamelHttpUri → SSRF) |
| Versões afetadas | Desde 2.17.0 até antes de 4.14.9, desde 4.15.0 até antes de 4.18.4, desde 4.19.0 até antes de 4.22.0 |
| Versões corrigidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23891 |
| Crédito | Atuin — Motor de Descoberta Automática de Vulnerabilidades, anciety do Tencent Xuanwu Lab |
MimeMultipartDataFormat.copyNonStandardHeaders agora passa cada cabeçalho MIME recebido por um MailHeaderFilterStrategy antes de defini-lo no Exchange, consistente com a filtragem de entrada que o consumidor de e-mail já aplica — portanto, cabeçalhos Camel* do corpo não confiável são descartados em vez de copiados literalmente:
// fixed
if (headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(),
camelMessage.getExchange())) {
continue; // filtered
}
camelMessage.setHeader(header.getName(), header.getValue());
Este repositório é publicado para fins educacionais e defensivos: ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização resolve o problema. Os payloads são benignos (um redirecionamento para um endpoint local). Não use este material contra sistemas que você não possui ou opera.