
Reproductor de prueba de concepto para la omisión de autenticación JWT en Apache Camel (CVE-2026-66908) que demuestra la falta de validación de iss/aud en camel-platform-http-main, con configuración basada en Docker y pasos de verificación.
iss/aud de JWTReproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el servidor HTTP
embebido de camel-main crea su autenticador JWT únicamente a partir de un almacén de claves cuando no se configuran
jwtIssuer ni jwtAudience, de modo que los tokens entrantes se comprueban solo por firma y caducidad — las
reclamaciones iss y aud nunca se validan.
| Runtime | Directorio | Stack |
|---|
| Camel Main (independiente) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
¿Por qué camel-main y no Camel Spring Boot / Camel Quarkus? La clase vulnerable,
JWTAuthenticationConfigurer, vive encamel-platform-http-main— el servidor HTTP embebido de camel-main (MainHttpServer), usado por aplicaciones camel-main independientes y porcamel-jbang. Ese servidor no es la integración platform-http de Camel Spring Boot (basada en servlets) ni la de Camel Quarkus (HTTP Quarkus/Vert.x con su propia seguridad), por lo que no existe un reproductor fiel en Spring Boot o Quarkus para este defecto concreto. Por tanto, este repositorio proporciona un reproductor camel-main independiente, que es el entorno exacto del fallo.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
Salida esperada en una compilación afectada:
[1] GET /protected sin token -> HTTP 401 (la autenticación se aplica)
[2] GET /protected con token iss=https://attacker.example aud=some-unrelated-service -> HTTP 200 (ACEPTADO — iss/aud NO se validan)
[3] GET /protected con el mismo token pero CADUCADO -> HTTP 401 (la caducidad SÍ se comprueba)
>>> DEMOSTRADO: ... las reclamaciones iss y aud nunca se comprobaron ... : true
| Propiedad | Valor |
|---|---|
| Componente | camel-platform-http-main (el servidor HTTP embebido de camel-main) |
| CWE | CWE-287 (autenticación incorrecta) / CWE-1259 (validación ausente de reclamaciones de seguridad) |
| Vector de ataque | Un JWT firmado con la clave de confianza (p. ej., un JWKS compartido) pero emitido para un emisor/audiencia diferente |
| Impacto | Se acepta cualquier token no caducado de cualquier parte que comparta la clave de firma: el despliegue aplica menos seguridad de la que el operador cree |
| Versiones afectadas | Desde 4.8.0 hasta antes de 4.22.0 |
| Versiones corregidas | 4.22.0 |
| JIRA | CAMEL-24281 |
| Crédito | n0mi1k |
A partir de 4.22.0 el servidor se niega a arrancar cuando hay un almacén de claves JWT configurado pero no se
establecen jwtIssuer ni jwtAudience, indicando las propiedades que faltan. Un operador que realmente quiera una
validación solo de firma y caducidad debe activarla explícitamente con camel.server.jwtAllowMissingIssuerAndAudience=true
(cierre seguro por defecto):
// 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, ...");
}
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a entender la vulnerabilidad, comprobar si están afectados y confirmar que la actualización la resuelve. Los tokens se generan localmente contra un almacén de claves de demostración desechable incluido en el proyecto. No utilice este material contra sistemas que no sean de su propiedad o que no administre.