
Reproducteur de preuve de concept pour le contournement de l'authentification JWT d'Apache Camel (CVE-2026-66908) démontrant l'absence de validation iss/aud dans camel-platform-http-main, avec une configuration basée sur Docker et des étapes de vérification.
iss/aud non validéesReproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le serveur HTTP embarqué de
camel-main construit son authentificateur JWT uniquement à partir d'un keystore lorsqu'aucun jwtIssuer ni
jwtAudience n'est configuré, si bien que les jetons entrants ne sont contrôlés que pour la signature et
l'expiration — les revendications iss et aud ne sont jamais validées.
| Contexte | Répertoire | Stack |
|---|
| Camel Main (autonome) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
Pourquoi camel-main et non Camel Spring Boot / Camel Quarkus ? La classe vulnérable,
JWTAuthenticationConfigurer, se trouve danscamel-platform-http-main— le serveur HTTP embarqué de camel-main (MainHttpServer), utilisé par les applications camel-main autonomes etcamel-jbang. Ce serveur n'est ni l'intégration platform-http de Camel Spring Boot (basée sur les servlets), ni celle de Camel Quarkus (HTTP Quarkus/Vert.x avec sa propre sécurité). Il n'existe donc aucun reproducteur Spring Boot ou Quarkus fidèle pour ce défaut spécifique. Ce dépôt fournit donc un reproducteur camel-main autonome, qui est le contexte exact du bug.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
Sortie attendue sur une version concernée :
[1] GET /protected with NO token -> HTTP 401 (auth is enforced)
[2] GET /protected with token iss=https://attacker.example aud=some-unrelated-service -> HTTP 200 (ACCEPTED — iss/aud NOT validated)
[3] GET /protected with the same token but EXPIRED -> HTTP 401 (expiry IS checked)
>>> PROVEN: ... the iss and aud claims were never checked ... : true
| Propriété | Valeur |
|---|---|
| Composant | camel-platform-http-main (le serveur HTTP embarqué de camel-main) |
| CWE | CWE-287 (Authentification inappropriée) / CWE-1259 (validation manquante des revendications de sécurité) |
| Vecteur d'attaque | Un JWT signé par la clé de confiance (p. ex. un JWKS partagé) mais émis pour un émetteur ou une audience différents |
| Impact | Tout jeton non expiré provenant de n'importe quel tiers partageant la clé de signature est accepté — le déploiement applique moins de contraintes que ne le croit l'opérateur |
| Versions affectées | De 4.8.0 à avant 4.22.0 |
| Versions corrigées | 4.22.0 |
| JIRA | CAMEL-24281 |
| Crédit | n0mi1k |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-66908.html
À partir de 4.22.0, le serveur refuse de démarrer lorsqu'un keystore JWT est configuré mais qu'aucun
jwtIssuer ni jwtAudience n'est défini, en nommant les propriétés manquantes. Un opérateur qui souhaite réellement
une validation limitée à la signature et à l'expiration doit l'activer explicitement avec
camel.server.jwtAllowMissingIssuerAndAudience=true (par défaut, fermeture en cas d'échec) :
// fixed (JWTAuthenticationConfigurer.assertIssuerOrAudienceConfigured)
if (ObjectHelper.isEmpty(audience) && ObjectHelper.isEmpty(issuer)) {
throw new IllegalArgumentException(
"JWT authentication requires camel.server.jwtIssuer or camel.server.jwtAudience to be configured, ...");
}
Ce dépôt est publié à des fins éducatives et défensives : aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont concernés et confirmer que la mise à niveau la résout. Les jetons sont créés localement à l'aide d'un keystore de démonstration jetable inclus dans le projet. N'utilisez pas ce contenu contre des systèmes dont vous n'êtes pas propriétaire ou que vous n'exploitez pas.