
Reproducteurs de preuve de concept pour l'injection d'en-têtes des CloudEvents structurés d'Apache Camel camel-knative (CVE-2026-63621), démontrant l'injection d'en-têtes via des champs d'extension malveillants dans les environnements d'exécution Spring Boot et Quarkus.
Reproducteurs de preuve de concept exécutables pour la même vulnérabilité Apache Camel, un par runtime :
| Runtime | Répertoire | Stack | Style |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | décodage direct (voir note) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (inclut Camel 4.20.0) | source knative entièrement pilotée par HTTP |
Les deux sont des versions affectées (le problème est corrigé dans 4.14.9 / 4.18.4 / 4.22.0), et toutes deux démontrent le même
défaut : le consommateur camel-knative accepte les CloudEvents dans deux modes de contenu. En mode binaire, les attributs
arrivent sous forme d'en-têtes HTTP et sont mappés via une HeaderFilterStrategy, de sorte que les en-têtes Camel* sont supprimés. En
mode structuré (Content-Type: application/cloudevents+json), l'événement complet est un corps JSON, et la version
affectée mappe chaque champ d'extension de ce JSON sur les en-têtes du message avec
setHeader(key.toLowerCase(Locale.US), value) et aucune HeaderFilterStrategy. Les noms d'extension sont choisis par
l'expéditeur, un attaquant peut donc définir un en-tête de contrôle interne à Camel. Ici, l'extension injectée camelsqlquery devient
l'en-tête CamelSqlQuery (les en-têtes Camel sont insensibles à la casse) — l'instruction qu'un producteur camel-sql exécuterait
(injection d'en-tête → CWE-74).
Remarque sur la variante Spring Boot. Le transport HTTP knative est basé sur Vert.x et est utilisé dans les déploiements camel-main / Camel Quarkus. Une application servlet Spring Boot n'héberge pas ce transport, c'est pourquoi le reproducteur Spring Boot pilote directement le décodage vulnérable exact (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) — le même chemin de code qu'une requête entranteapplication/cloudevents+jsonemprunte à l'intérieur du consommateur knative. La variante Camel Quarkus est le reproducteur entièrement piloté par HTTP (POST d'un CloudEvent vers la source en direct).
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 (les deux variantes) :
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
| Propriété | Valeur |
|---|---|
| Composant | camel-knative (Spring Boot : camel-knative ; Quarkus : camel-quarkus-knative) |
| CWE | CWE-20 (Validation inappropriée des entrées) → CWE-74 (Injection) |
| Vecteur d'attaque | Un CloudEvent en mode structuré (application/cloudevents+json) avec un champ d'extension choisi par l'attaquant |
| Impact | Injection d'en-têtes de contrôle internes à Camel sur l'Exchange (ici CamelSqlQuery) |
| Versions affectées | À partir de 3.15.0, avant 4.14.9 ; à partir de 4.15.0, avant 4.18.4 ; à partir de 4.19.0, avant 4.22.0 |
| Versions corrigées | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24084 |
| Crédit | Andrea Cosentino (Apache Software Foundation) |
Le mappage des extensions en mode structuré fait désormais passer chaque champ par une HeaderFilterStrategy (une
DefaultHeaderFilterStrategy) avant de le définir, conformément au chemin du mode de contenu binaire — de sorte que les
noms d'extension Camel* provenant du corps non fiable sont supprimés :
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
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. La valeur injectée est un marqueur bénin (une chaîne SQL inerte qui n'est jamais exécutée ici). N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.