
Reproducer eseguibile per Spring Boot e Quarkus per CVE-2026-85248, una race condition concorrente sulla firma in camel-pqc che causa il bypass della verifica della firma ML-DSA, con build affette e corrette.
Signature (bypass della verifica della firma)Reproduttore proof-of-concept eseguibile per la vulnerabilità di Apache Camel in cui il producer PQC manteneva una singola
istanza di java.security.Signature e la utilizzava per ogni exchange senza sincronizzazione. Signature è stateful
e non thread-safe: update() accumula i dati da firmare o verificare, e verify()/sign() consumano quello
stato accumulato. Con exchange concorrenti che condividono una sola istanza, le chiamate update e verify di messaggi diversi
si interlacciano, così una verifica può completarsi su dati appartenenti a un altro exchange, o su un buffer
parzialmente accumulato. L'esito è non deterministico e include una verifica che riporta successo per un messaggio
la cui firma non è mai stata effettivamente controllata, il che vanifica la garanzia che il componente esiste per fornire. Raggiungerla
richiede soltanto traffico concorrente attraverso lo stesso endpoint — la condizione ordinaria per una route Camel sotto carico.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (Camel 4.22.0, affetto; controllo corretto CQ 3.40.0 / Camel 4.22.1) |
Entrambi i moduli dimostrano il comportamento affetto e quello corretto.
Una route firma ogni messaggio con una chiave post-quantum ML-DSA e poi verifica immediatamente la firma appena
prodotta, quindi ogni messaggio firmato legittimamente deve verificarsi come true. Il driver esegue 1024 di questi
round-trip sign→verify in modo concorrente (16 thread) attraverso i producer pqc: condivisi.
true — alcune restituiscono false, altre sollevano
errori del motore di firma — perché la singola Signature stateful condivisa tra exchange concorrenti viene corrotta
dall'interlacciamento. Un verdetto non corrisponde più al messaggio per cui è stato calcolato. (La stessa race, nella direzione
pericolosa, consente a una verify() di riuscire per dati che non ha mai coperto.)Signature.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: many of 1024 broken; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85248-pqc-signature-race-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 0 broken; >>> 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.22.0): many broken
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: 0 broken
La race è, per sua natura, dipendente dal timing; il reproducer genera abbastanza concorrenza (1024 round-trip) da manifestarsi in modo affidabile sulla build affetta. Se una esecuzione su una build affetta mostra 0 broken, rieseguirla.
| Proprietà | Valore |
|---|---|
| Componente | camel-pqc (firma/verifica di PQCProducer) |
| CWE | CWE-362 (Esecuzione concorrente che utilizza una risorsa condivisa con sincronizzazione impropria) |
| Gravità | MEDIA |
| Vettore di attacco | Traffico concorrente attraverso lo stesso endpoint pqc: che condivide un'unica istanza stateful di java.security.Signature |
| Impatto | Verifica della firma non deterministica; una verifica può riportare successo per un messaggio la cui firma non è mai stata controllata |
| Versioni affette | Dalla 4.12.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-24445 |
| Credito | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer non condivide più la Signature tra exchange
concorrenti. Quando il producer creava l'istanza da sé, ora ne crea una nuova per ogni exchange
(signerForExchange()); quando l'utente ha configurato un'istanza (a livello JVM public static final), l'accesso ad essa è
synchronized. In entrambi i casi, nessuna coppia di exchange intreccia le proprie sequenze init/update/verify sulla stessa istanza.
Limitare la route affetta a un singolo consumer concorrente, in modo che nessuna coppia di exchange utilizzi l'istanza Signature contemporaneamente.
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono affetti e confermare che l'aggiornamento la risolve. I messaggi e le chiavi sono fixture locali inerti. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.