
Reproducteur Spring Boot exécutable pour CVE-2026-85246, démontrant la divulgation d'exceptions du consommateur camel-mina via le socket et vérifiant le correctif muteException.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le consommateur Mina réécrivait
exchange.getException() directement sur la socket vers le pair distant lorsque le traitement d'un échange échouait.
Via un codec textline, cela transmet au pair le nom de classe et le message de l'exception ; via le codec objet, cela
transmet l'exception sérialisée, chaîne de causes incluse. Un pair distant capable de provoquer un échec pouvait lire des
détails internes sur le déploiement — noms de classes et de packages, et tout ce que porte un message ou une cause imbriquée, ce qui en
pratique inclut des chemins, des noms d'hôtes et des détails de connexion. Le consommateur n'avait aucune option pour supprimer cela, contrairement aux
consommateurs de la famille HTTP alignés par CAMEL-23651.
Spring Boot uniquement. Il n'existe pas d'extension
camel-quarkus-mina, ce reproducteur ne fournit donc qu'un seul module Camel Spring Boot. (La faille se situe dans leMinaConsumerdu composant, qui est indépendant du runtime.)
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (affecté ; corrigé en 4.22.1) |
Un consommateur TCP Mina (sync=true, textline=true) traite chaque ligne entrante et échoue — représentant n'importe quelle route
qui rencontre une erreur interne. La route lève une IllegalStateException dont le message porte des détails internes simulés
(un faux chemin de configuration /etc/camel/secret.properties, un faux hôte et un jeton marqueur). Le pilote d'exploitation est un
simple pair TCP distant : il ouvre une socket, envoie une ligne et lit la réponse que le consommateur renvoie.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed générique — sans nom de classe, message ni trace
de pile de l'exception de la route — tout en répondant toujours, afin qu'un pair synchrone ne soit pas laissé en attente jusqu'au délai d'expiration.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| Propriété | Valeur |
|---|---|
| Composant | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (Génération de message d'erreur contenant des informations sensibles) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Un pair distant TCP/UDP provoque un échec de route et lit l'exception dans la réponse renvoyée sur la socket |
| Impact | Divulgation d'informations : classe/message de l'exception via le codec textline, ou l'exception sérialisée + chaîne de causes via le codec objet (noms d'hôtes internes, chemins, détails de connexion) |
| Versions affectées | Depuis 4.0.0 avant 4.18.5, depuis 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24476 |
| Crédit | Claude Security Scan Tool |
Avis : https://camel.apache.org/security/CVE-2026-85246.html
MinaConsumer ajoute une option de consumer muteException (par défaut true).
Lorsqu'elle est activée, un échange en échec n'écrit plus exchange.getException() en retour ; à la place, il écrit une
Exception("Exchange processing failed") de substitution avec une pile d'appels vide — toujours une Exception (ainsi un pair
utilisant le codec objet en reçoit bien une) mais ne portant ni la classe, ni le message, ni les frames de l'exception de la route. Une réponse est tout de même écrite afin qu'un pair
synchrone ne soit pas laissé en attente jusqu'au timeout. Définissez muteException=false pour restaurer le comportement précédent.
Ajoutez un gestionnaire onException qui définit explicitement le corps de la réponse, afin que le framework n'écrive jamais l'exception en retour
au pair.
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 chemin de configuration, l'hôte et le jeton marqueur dans la route défaillante sont des fixtures locales inertes et fictives. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.