
Reprodutor de prova de conceito para bypass de autenticação JWT no Apache Camel (CVE-2026-66908), demonstrando a ausência de validação de iss/aud no camel-platform-http-main, com configuração baseada em Docker e etapas de verificação.
iss/aud não validadosReprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o servidor HTTP embarcado
do camel-main constrói seu autenticador JWT apenas a partir de um keystore quando nem jwtIssuer nem jwtAudience está
configurado, portanto os tokens recebidos são verificados apenas quanto a assinatura e expiração — as declarações iss e aud
nunca são validadas.
| Runtime | Diretório | Stack |
|---|
| Camel Main (standalone) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
Por que camel-main e não Camel Spring Boot / Camel Quarkus? A classe vulnerável,
JWTAuthenticationConfigurer, fica emcamel-platform-http-main— o servidor HTTP embarcado do camel-main (MainHttpServer), usado por aplicações camel-main standalone e pelocamel-jbang. Esse servidor não é a integração platform-http do Camel Spring Boot (baseada em servlets) nem a do Camel Quarkus (Quarkus/Vert.x HTTP com segurança própria), portanto não há um reprodutor fiel em Spring Boot ou Quarkus para esse defeito específico. Este repositório, portanto, fornece um reprodutor standalone camel-main, que é o hospedeiro correto para o bug.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
Saída esperada em uma build afetada:
[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
| Propriedade | Valor |
|---|---|
| Componente | camel-platform-http-main (o servidor HTTP embarcado do camel-main) |
| CWE | CWE-287 (Autenticação Incorreta) / CWE-1259 (validação ausente de declarações de segurança) |
| Vetor de ataque | Um JWT assinado pela chave confiável (ex.: um JWKS compartilhado), mas emitido para um issuer/audience diferente |
| Impacto | Qualquer token não expirado de qualquer parte que compartilhe a chave de assinatura é aceito — a implantação impõe menos do que o operador acredita |
| Versões afetadas | De 4.8.0 até antes de 4.22.0 |
| Versões corrigidas | 4.22.0 |
| JIRA | CAMEL-24281 |
| Crédito | n0mi1k |
A partir de 4.22.0, o servidor se recusa a iniciar quando um keystore JWT está configurado, mas nem jwtIssuer nem
jwtAudience está definido, indicando as propriedades ausentes. Um operador que realmente deseja validação apenas de assinatura e expiração
deve optar explicitamente por camel.server.jwtAllowMissingIssuerAndAudience=true (fail-closed por
padrão):
// 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 repositório é publicado para fins educacionais e defensivos: ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se eles são afetados e confirmar que a atualização a resolve. Os tokens são gerados localmente contra um keystore de demonstração descartável incluído no projeto. Não use este material contra sistemas que você não possui ou opera.