Um JWT com assinatura válida não é automaticamente válido para toda API que confia naquela chave. O token também precisa ter sido emitido pela autoridade esperada e para a audiência correta. A CVE-2026-66908 mostra o que acontece quando essa segunda parte desaparece silenciosamente: o Apache Camel aceitava tokens destinados a outro serviço, desde que estivessem dentro da validade e assinados por uma chave presente no keystore configurado.
Esse cenário é especialmente relevante em empresas que compartilham um provedor de identidade entre várias aplicações. O atacante não precisa falsificar assinatura nem descobrir o segredo do JWT. Ele precisa obter legitimamente um token aceito pelo mesmo domínio de confiança e apresentá-lo a uma API que deveria rejeitar aquele emissor ou aquela audiência.

O que a CVE-2026-66908 confirma
O Apache classifica a falha como alta e CWE-287, autenticação imprópria. O registro da NVD exibe CVSS 3.1 de 7,5 atribuído ao CISA-ADP, com vetor AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N; a NVD ainda não publicou uma pontuação própria. O componente afetado é o camel-platform-http-main, da versão 4.8.0 até antes da 4.22.0. Tanto o servidor HTTP da aplicação quanto o servidor de gerenciamento passavam pelo caminho vulnerável.
- Pré-condição: autenticação JWT habilitada com um keystore e sem jwtIssuer nem jwtAudience
- O que continuava sendo validado: assinatura e expiração do token
- O que não era validado: as claims iss e aud
- Acesso necessário: rede, sem credencial prévia na API alvo
- Versão com comportamento fail closed: Apache Camel 4.22.0
Onde a validação desaparecia
Segundo o advisory, JWTAuthenticationConfigurer.buildJwtOptions retornava null quando jwtIssuer e jwtAudience não estavam configurados. O chamador então pulava JWTAuthOptions.setJWTOptions, e o Vert.x JWTAuth era construído apenas com o keystore. O servidor iniciava normalmente, sem aviso de que a política aplicada era mais permissiva que a esperada. As opções de issuer e audience só chegaram à linha principal na versão 4.21.0, então versões anteriores nem ofereciam esse controle naquele componente.
GET /orders HTTP/1.1
Host: api-b.example
Authorization: Bearer <unexpired-token-for-api-a-signed-by-a-trusted-key>
Accept: application/jsonO teste decisivo não é enviar um token inválido. É comparar dois tokens legítimos assinados por uma chave confiável: um com aud correspondente à API e outro emitido para uma audiência diferente. Na configuração vulnerável, ambos podiam atravessar a autenticação. Isso torna o achado fácil de perder em testes que verificam apenas token expirado, assinatura alterada e algoritmo inseguro.

Assinatura não substitui contexto
A assinatura responde se o token foi alterado e se veio de uma chave confiável. A claim iss identifica quem o emitiu; aud limita para qual recurso ele foi criado. Em um provedor multi-tenant ou num keystore que confia em várias chaves, omitir essas duas comparações amplia o conjunto de credenciais aceitas. Mesmo com um único emissor corporativo, um token de uma aplicação interna pode ganhar acesso a outra API sem que o IdP tenha autorizado esse uso.
- Mapeie todos os emissores e chaves aceitos pelo keystore, não apenas o IdP nominal
- Peça tokens para duas audiências controladas e compare a resposta do mesmo endpoint
- Repita o teste no servidor da aplicação e no servidor de gerenciamento
- Acesse o backend pelo caminho direto para confirmar que o gateway não é a única camada validando claims
- Verifique se erros de autenticação distinguem token expirado, assinatura inválida e audiência incorreta nos logs internos
Como fazer a triagem sem explorar produção
A primeira etapa pode ser inteiramente estática. Confirmamos a versão resolvida no build e procuramos as propriedades de autenticação nos arquivos de aplicação, manifests e charts. O comando abaixo não envia tráfego nem manipula token. Ele revela se o componente está presente e se a configuração menciona os controles relevantes. Segredos não devem ser copiados para o relatório.
./mvnw -q dependency:tree \
-Dincludes=org.apache.camel:camel-platform-http-main
rg -n 'authenticationEnabled|jwtKeyStore|jwtIssuer|jwtAudience|jwtAllowMissingIssuerAndAudience' \
src/main/resources deploy chartsDepois da triagem, um teste dinâmico controlado deve usar tokens emitidos para o laboratório e observar também o caminho direto ao Camel. Se a validação de iss e aud existe apenas no API gateway, qualquer rota interna, ingress alternativo ou porta de gerenciamento que contorne o gateway reabre a falha de confiança.
Correção exige atenção à linha de versão
A recomendação principal do Apache é atualizar para 4.22.0. Nessa versão, o servidor se recusa a iniciar com keystore JWT quando issuer e audience estão ambos ausentes, a menos que o operador habilite explicitamente jwtAllowMissingIssuerAndAudience. O valor padrão desse opt-out é false. A mudança transforma uma política implícita e permissiva em uma decisão visível de configuração.
- Atualize preferencialmente para Apache Camel 4.22.0 ou posterior
- Na linha 4.14.x, use ao menos 4.14.9 e configure jwtIssuer, jwtAudience ou ambos
- Na linha 4.18.x, use ao menos 4.18.4 e configure jwtIssuer, jwtAudience ou ambos
- Não trate a atualização para 4.14.9 ou 4.18.4 como correção automática, o padrão permissivo foi mantido nessas linhas
- Mantenha jwtAllowMissingIssuerAndAudience desabilitado na 4.22.0 ou posterior
- Restrinja o keystore ao menor conjunto possível de chaves, idealmente com signer dedicado ao serviço
- Garanta que o backend e a interface de gerenciamento não possam contornar a validação feita pelo gateway
O que isso muda no escopo de um pentest
Testar JWT não termina em tentar alg none ou modificar a assinatura. Um pentest de API precisa testar a fronteira entre serviços: token correto para o usuário, mas errado para o recurso; chave confiável, mas emissor inesperado; acesso negado no gateway, mas aceito no backend. A CVE-2026-66908 é um bom exemplo de falha que passa por checklist superficial e aparece quando o teste acompanha a identidade completa, da emissão até cada ponto que toma a decisão de acesso.