
Reproducteur de preuve de concept exécutable pour le contournement de la validation de l'émetteur camel-keycloak d'Apache Camel (CWE-287), démontrant le comportement affecté et corrigé dans Spring Boot et Quarkus.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le
KeycloakSecurityProcessor de camel-keycloak validait l'émetteur d'un jeton introspecté uniquement lorsque la réponse d'introspection
contenait effectivement une revendication iss. Lorsque la revendication était absente, la vérification était ignorée plutôt que traitée comme un
échec, de sorte qu'un jeton que l'émetteur configuré n'avait pas émis pouvait être accepté — à condition que le point de terminaison d'introspection
réponde active sans nommer d'émetteur. Lorsqu'un déploiement effectue une introspection auprès d'un point de terminaison qui omet iss et
sert plus d'un émetteur, la conséquence est qu'il authentifie un appelant qu'il aurait dû rejeter (CWE-287).
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak (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 le comportement corrigé face au véritable KeycloakSecurityProcessor.
Le pilote configure un KeycloakSecurityPolicy avec validateIssuer=true (émetteur attendu
http://localhost:8080/realms/test-realm) et un introspecteur de jeton qui signale le jeton comme actif mais ne renvoie
aucune revendication iss — exactement ce que produit un point de terminaison d'introspection de broker/passerelle, puisque la RFC 7662 rend iss
facultatif. Il pilote ensuite un KeycloakSecurityProcessor avec un en-tête Authorization: Bearer <attacker-token> et
indique si la route protégée est atteinte.
iss fait que le processeur ignore la vérification de l'émetteur, de sorte que le jeton est accepté et que la
route est atteinte — un jeton provenant d'un émetteur non prévu est authentifié.iss absent constitue un échec de validation ; le processeur lève une CamelAuthorizationException
(« Token issuer missing… ») et la route n'est jamais atteinte.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> 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): route reached, token accepted
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: CamelAuthorizationException "Token issuer missing"
| Propriété | Valeur |
|---|---|
| Composant | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (Authentification incorrecte) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Un jeton provenant d'un émetteur non prévu, introspecté auprès d'un endpoint qui omet iss et dessert plus d'un émetteur, alors que validateIssuer=true |
| Impact | Le déploiement authentifie un appelant dont le jeton n'a pas été émis par l'émetteur configuré |
| Versions affectées | À partir de 4.15.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-24448 |
| Crédit | Claude Security Scan Tool |
Avis : https://camel.apache.org/security/CVE-2026-85301.html
Le module Quarkus affecté est construit sur CQ 3.39.0 (Camel 4.22.0), où
camel-quarkus-keycloakcorrespond à une version de Camel affectée. Le correctif est intégré dans CQ 3.40.0 (Camel 4.22.1).
KeycloakSecurityProcessor traite désormais l'absence de la revendication iss comme un
échec de validation : lorsque la validation de l'émetteur est activée et que le résultat de l'introspection ne porte aucun émetteur, il lève
CamelAuthorizationException au lieu de retourner prématurément et de laisser passer la requête. Le code précédent ignorait la
comparaison dès que la revendication était absente, ce qui laissait l'émetteur non vérifié précisément pour les jetons qui ne nommaient aucun
émetteur.
Assurez-vous que l'endpoint d'introspection renvoie la revendication iss et ne dessert qu'un seul émetteur, afin qu'un jeton provenant de tout autre
émetteur soit soit nommé (et rejeté), soit jamais introspecté comme actif.
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. L'introspecteur de jetons est un stub en processus et aucun serveur Keycloak réel ni appel réseau n'est impliqué ; le « jeton d'attaquant » est une chaîne de remplacement opaque. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.