
Reproducteurs exécutables Spring Boot et Quarkus pour CVE-2026-84180, démontrant la fuite d'exceptions du consommateur HTTP camel-knative et vérifiant le correctif muteException.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le consumer HTTP Knative, lorsqu'un
échange échouait côté consumer, écrivait l'exception résultante dans le corps de la réponse HTTP renvoyée à l'appelant distant
— y compris son nom de classe, son message et la trace de pile complète. Un émetteur externe pouvait donc provoquer une défaillance
et lire des détails internes sur le déploiement : noms de classes et de packages, noms de systèmes de fichiers ou d'hôtes portés par les messages
d'exception, la structure de la route, et — lorsqu'un message d'exception intègre une chaîne de connexion ou une configuration — ces
données directement. camel-knative était le dernier consumer de la famille HTTP qui n'avait pas été aligné sur le comportement
muteException établi pour les autres consumers HTTP par CAMEL-23651.
| Runtime | Répertoire | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.22.0 (affecté ; corrigé en 4.22.1), consumer sur le serveur platform-http Vert.x de Camel |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-knative (Camel 4.15.0, affecté ; contrôle corrigé CQ 3.40.0 / Camel 4.22.1), consumer sur Quarkus HTTP |
Les deux modules démontrent le comportement affecté et le comportement corrigé.
Une route source (consumer) HTTP Knative reçoit un CloudEvent puis échoue lors de son traitement — représentant
n'importe quelle route qui rencontre une erreur interne (une recherche de source de données échouée, un timeout en aval, un bug). La route lève une
IllegalStateException dont le message porte des détails internes simulés : un faux nom d'hôte interne
(internal-db.prod.svc.cluster.local), une fausse URL JDBC et un jeton marqueur INTERNAL-DETAIL-MARKER-7F3A2B. L'attaquant
n'est autre qu'un appelant distant : il envoie en POST un CloudEvent bien formé au consumer et lit la réponse que le consumer
renvoie.
at com.example... / du framework.muteException (par défaut
true), de sorte que le statut d'erreur est renvoyé mais aucun détail d'exception n'atteint l'appelant.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: stack trace leaks; prints >>> PROVEN
docker compose down
# Patched control: rebuild with the fixed version, then run on the host
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84180-knative-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: empty body; prints >>> 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.15.0): stack trace leaks; >>> PROVEN
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: empty body; >>> Not exploited
| Propriété | Valeur |
|---|---|
| Composant | camel-knative (consommateur HTTP Knative, KnativeHttpConsumer.computeResponseBody) |
| CWE | CWE-209 (Génération de message d'erreur contenant des informations sensibles) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Un appelant distant provoque un échec de route côté consommateur et lit le détail de l'exception dans le corps de la réponse |
| Impact | Divulgation d'informations : la classe/le message/la trace de pile de l'exception (noms d'hôtes internes, noms de paquets, forme de la route, chaînes de connexion intégrées) parviennent à un expéditeur externe |
| 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-24428 |
| Crédit | Claude Security Scan Tool |
Avis : https://camel.apache.org/security/CVE-2026-84180.html
KnativeHttpConsumer.computeResponseBody vérifie désormais une nouvelle
option muteException (consommateur, valeur par défaut true). Lorsqu'elle est activée, un échange en échec produit un corps de réponse vide
(new byte[0]) plutôt que la trace de pile — le corps vide est délibéré afin que le statut d'erreur soit préservé (un
corps null ferait envoyer 204 No Content par l'appelant). Définissez muteException=false pour restaurer la sortie précédente.
Cela aligne camel-knative sur les autres consommateurs de la famille HTTP (CAMEL-23651).
Ajoutez un gestionnaire onException à la route du consommateur qui définit explicitement le corps de la réponse (par exemple à un corps
vide ou à un message générique), afin que le framework ne réécrive jamais l'exception vers l'appelant.
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 à niveau la résout. Le nom d'hôte « interne », l'URL JDBC et le jeton marqueur dans la route en échec sont des fixtures locales inertes et inventées — aucun véritable secret n'est impliqué. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.