
Reproducteurs de preuve de concept pour l'injection d'en-têtes MimeMultipart de camel-mail d'Apache Camel (CVE-2026-59230), démontrant un SSRF via l'injection de CamelHttpUri dans les environnements d'exécution Spring Boot et Quarkus.
MimeMultipart : injection d'en-tête (headersInline)Reproducteurs de preuve de concept exécutables pour la même vulnérabilité Apache Camel, un par runtime :
| Runtime | Répertoire | 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 (embarque Camel 4.20.0) |
Ces deux versions sont affectées (le problème est corrigé dans 4.14.9 / 4.18.4 / 4.22.0), et les deux présentent le même défaut : le format de données MimeMultipart de camel-mail, lors de la désérialisation avec headersInline=true, copie chaque en-tête MIME non standard du message entrant sur l'Exchange Camel via setHeader sans appliquer aucun HeaderFilterStrategy. Les noms des en-têtes MIME proviennent du corps non fiable, si bien qu'un expéditeur peut placer un en-tête dans l'espace de noms interne de Camel (par ex. CamelHttpUri) et le faire définir sur l'Exchange — même après que la route a supprimé les en-têtes Camel* à la frontière HTTP. Un composant en aval lit ensuite l'en-tête de contrôle injecté (injection d'en-tête → CWE-74).
Dans ces reproducteurs, le CamelHttpUri injecté redirige le producteur HTTP en aval du endpoint prévu /legit-backend vers un endpoint interne /internal/secret (SSRF), renvoyant visiblement des données internes.
Chaque sous-répertoire est un projet autonome avec son propre Dockerfile, docker-compose.yml, et un README avec tous les détails et les étapes de reproduction. En résumé, pour l'un ou l'autre :
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
Sortie attendue sur une version affectée :
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
| Propriété | Valeur |
|---|---|
| Composant | camel-mail — format de données MimeMultipart (Spring Boot : camel-mail-starter ; Quarkus : camel-quarkus-mail) |
| CWE | CWE-20 (Validation incorrecte des entrées) → CWE-74 (Injection) |
| Vecteur d'attaque | Un corps MIME multipart élaboré désérialisé avec headersInline=true |
| Impact | Injection d'en-têtes de contrôle internes à Camel sur l'Exchange (ici : CamelHttpUri → SSRF) |
| Versions affectées | De 2.17.0 avant 4.14.9, de 4.15.0 avant 4.18.4, de 4.19.0 avant 4.22.0 |
| Versions corrigées | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23891 |
| Crédit | Atuin — Automated Vulnerability Discovery Engine, anciety of Tencent Xuanwu Lab |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-59230.html
MimeMultipartDataFormat.copyNonStandardHeaders fait désormais passer chaque en-tête MIME entrant par un MailHeaderFilterStrategy avant de le définir sur l'Exchange, conformément au filtrage entrant que le consommateur mail applique déjà — si bien que les en-têtes Camel* provenant du corps non fiable sont supprimés au lieu d'être copiés tels quels :
// fixed
if (headerFilterStrategy.applyFilterToExternalHeaders(header.getName(), header.getValue(),
camelMessage.getExchange())) {
continue; // filtered
}
camelMessage.setHeader(header.getName(), header.getValue());
Ce dépôt est publié à des fins éducatives et défensives : aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, à vérifier s'ils sont affectés et à confirmer que la mise à niveau la résout. Les payloads sont bénins (une redirection vers un endpoint local). N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.