
Reproducteur de preuve de concept exécutable pour CVE-2026-85315, démontrant la divulgation de messages d'exception du consommateur camel-grpc (CWE-209) dans Camel Spring Boot et Quarkus.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où, lorsqu'une route derrière un consumer gRPC
échouait, le message de l'exception de la route était copié dans la description du Status gRPC. Contrairement à la cause du statut
(withCause(...)), qui reste locale au serveur, la description est transmise au client appelant, de sorte qu'un
appelant externe capable de provoquer une défaillance pouvait lire le message d'erreur interne — en pratique, les noms de classes et de packages,
les chemins de fichiers, les noms d'hôtes et les détails de connexion portés par les messages d'exception (CWE-209). Il s'agit du membre gRPC de la
même famille d'exceptions de consumer non masquées que les avis knative, mina et CXF publiés en parallèle.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0, affecté ; contrôle corrigé CQ 3.40.0 / Camel 4.22.1) |
Les deux modules démontrent le comportement affecté et corrigé face au véritable consumer camel-grpc.
Chaque module exécute un consumer camel-grpc (le service PingPong issu du propre proto de test de camel-grpc) dont la route échoue toujours
avec un message d'apparence interne :
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
Le point de terminaison du vérificateur /exploit/attack joue le rôle d'un client gRPC externe : il appelle PingSyncSync, intercepte la
StatusRuntimeException et rapporte le code Status ainsi que la description renvoyés par le serveur.
muteException vaut true par défaut, de sorte que la description est la valeur générique
"Exchange processing failed" et que le message réel ne quitte jamais le serveur (il n'est conservé que dans la cause du statut, locale uniquement).# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): description leaks the internal message
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"
Chaque module expose le vérificateur sur 8080 et exécute le consommateur camel-grpc sur 50051 au sein du même processus ; seul
8080 est publié.
| Propriété | Valeur |
|---|---|
| Composant | camel-grpc (GrpcMethodHandler, consommateur) |
| CWE | CWE-209 (Génération de message d'erreur contenant des informations sensibles) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Un client gRPC externe provoque l'échec d'une route et lit la description Status transmise |
| Impact | Des détails d'erreur internes (noms de classes/paquets, chemins, noms d'hôtes, détails de connexion) sont divulgués à l'appelant |
| Versions affectées | À partir de 4.0.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24478 |
| Crédit | Claude Security Scan Tool |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-85315.html
Le module Quarkus affecté est construit sur CQ 3.39.0 (Camel 4.22.0). Le correctif de contrôle est CQ 3.40.0 (Camel 4.22.1).
GrpcMethodHandler ajoute une option de consommateur muteException (par défaut
true). Lorsqu'elle est activée, un échange en échec produit la description générique "Exchange processing failed" dans le
statut transmis ; l'exception de la route reste attachée localement via withCause(...), que gRPC ne transmet pas
au client. Définissez muteException=false sur l'endpoint pour restaurer le comportement précédent.
Mappez les échecs sur un statut explicite dans un gestionnaire onException afin que le framework ne copie jamais le message de l'exception
dans la description.
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 message « interne » est un
espace réservé bénin (db.internal.local, svc_admin) et l'ensemble de la démonstration s'exécute dans un seul processus. N'utilisez pas ce
matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.