
Reproducer proof-of-concept per il bypass dell'autenticazione JWT di Apache Camel (CVE-2026-66908) che dimostra la mancata validazione di iss/aud in camel-platform-http-main, con configurazione basata su Docker e passaggi di verifica.
iss/aud non validatiRiproduttore proof-of-concept eseguibile per la vulnerabilità Apache Camel in cui il server HTTP integrato di camel-main
costruisce il proprio autenticatore JWT a partire dal solo keystore quando non sono configurati né jwtIssuer né jwtAudience,
così i token in ingresso vengono controllati solo per firma e scadenza — le claim iss e aud non vengono mai
validati.
| Runtime | Directory | Stack |
|---|
| Camel Main (standalone) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
Perché camel-main e non Camel Spring Boot / Camel Quarkus? La classe vulnerabile,
JWTAuthenticationConfigurer, vive incamel-platform-http-main— il server HTTP integrato di camel-main (MainHttpServer), usato dalle applicazioni standalone camel-main e dacamel-jbang. Quel server non è l'integrazione platform-http di Camel Spring Boot (basata su servlet) né quella di Camel Quarkus (HTTP Quarkus/Vert.x con la propria sicurezza), quindi non esiste un riproduttore Spring Boot o Quarkus fedele per questo specifico difetto. Questo repository fornisce pertanto un riproduttore camel-main standalone, che è l'host accurato per il bug.
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
Output atteso su una build affetta:
[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
| Proprietà | Valore |
|---|---|
| Componente | camel-platform-http-main (il server HTTP integrato di camel-main) |
| CWE | CWE-287 (Improper Authentication) / CWE-1259 (missing validation of security claims) |
| Vettore d'attacco | Un JWT firmato con la chiave attendibile (es. un JWKS condiviso) ma emesso per un issuer/audience diverso |
| Impatto | Qualsiasi token non scaduto proveniente da qualsiasi parte che condivide la chiave di firma viene accettato — la distribuzione impone meno di quanto l'operatore creda |
| Versioni interessate | Dalla 4.8.0 precedente alla 4.22.0 |
| Versioni corrette | 4.22.0 |
| JIRA | CAMEL-24281 |
| Crediti | n0mi1k |
Dalla 4.22.0 il server rifiuta di avviarsi quando è configurato un keystore JWT ma non sono impostati né jwtIssuer né
jwtAudience, indicando le proprietà mancanti. Un operatore che desidera davvero la sola validazione firma-e-scadenza
deve sceglierla esplicitamente con camel.server.jwtAllowMissingIssuerAndAudience=true (fail-closed di
default):
// 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, ...");
}
Questo repository è pubblicato a scopo educativo e difensivo: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolva. I token vengono generati localmente contro un keystore demo usa-e-getta incluso nel progetto. Non utilizzare questo materiale contro sistemi che non possedi o che non gestisci.