
Proof-of-concept eseguibile per Spring Boot e Quarkus che riproduce il bypass di autenticazione thread-bound-subject di Apache Camel camel-shiro, con controlli vulnerabili e corretti.
Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il processore di sicurezza Shiro saltava
la verifica delle credenziali quando il Subject Shiro già legato al thread corrente portava lo stesso principal dello
scambio in ingresso. Poiché il thread che trasporta uno scambio Camel è prelevato da un pool e riutilizzato tra
scambi, un subject lasciato legato da uno scambio autenticato precedente poteva soddisfare il controllo per uno scambio successivo
che presentava nessuna credenziale valida propria — la password su quello scambio successivo non veniva mai verificata. L'
attaccante non ha bisogno di altro che inviare una richiesta che nomina un principal attualmente in uso attivo.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0 (affetto; corretto 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro (Camel 4.15.0, affetto; controllo corretto CQ 3.40.0 / Camel 4.22.1) |
Entrambi i moduli dimostrano il comportamento affetto e quello corretto.
Una route è protetta da una ShiroSecurityPolicy costruita con alwaysReauthenticate=false — la modalità documentata in
cui il subject autenticato viene deliberatamente mantenuto legato al thread worker (in pool, riutilizzato) tra gli scambi.
Il driver di exploit, all'interno di un singolo thread worker HTTP, esegue due scambi in ordine:
ringo con la password corretta starr — si autentica e lascia il subject Shiro
legato a questo thread (come farebbe una precedente richiesta autenticata in un servizio occupato);ringo ma con una password errata not-starr, sullo stesso
thread.AuthenticationException, anche se lo stesso utente è ancora legato al thread.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wrong password reaches protected logic; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84181-shiro-auth-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): wrong password reaches protected logic
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected
| Proprietà | Valore |
|---|---|
| Componente | camel-shiro (ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287 (Autenticazione impropria) |
| Gravità | MEDIA |
| Vettore di attacco | Una richiesta che indica un principal attualmente associato a un worker thread riutilizzato, priva di credenziali valide proprie |
| Impatto | Bypass dell'autenticazione: una richiesta non autenticata viene accettata come un principal già associato; la sua password non viene mai verificata |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.18.5, dalla 4.19.0 precedente alla 4.22.1 |
| Versioni corrette | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24439 |
| Riconoscimento | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser non salta più il login
quando il subject associato al thread porta già lo stesso principal. Il codice precedente effettuava un cortocircuito su
currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal()); un nome utente corrispondente non dice nulla
sulla password presentata con questo scambio. Il processor ora chiama currentUser.login(token) su ogni scambio,
così le credenziali presentate vengono sempre verificate. alwaysReauthenticate controlla ancora la longevità rememberMe
del subject, ma non determina più se la password viene verificata.
Assicurarsi che il subject Shiro venga rimosso dal thread al termine di ogni scambio (in modo che nessun subject possa essere ereditato da
uno successivo) — ad esempio con un onCompletion/processor che chiama ThreadContext.unbindSubject() di Shiro — fino a
quando non sarà possibile aggiornare.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Gli utenti, le password e le chiavi qui presenti sono fixture locali inerti. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.