
Proof-of-concept eseguibile in Spring Boot e Quarkus per CVE-2026-85243, che dimostra il downgrade della verifica di integrità di Apache Camel camel-crypto-pgp e la relativa correzione.
Reproduttore eseguibile di proof-of-concept per la vulnerabilità di Apache Camel in cui il formato dati PGP di unmarshal()
verificava il codice di rilevamento delle modifiche solo quando il messaggio utilizzava il pacchetto dati protetto da integrità
cifrato simmetricamente di OpenPGP. Il più vecchio pacchetto dati cifrato simmetricamente non contiene tale codice, e la modalità CFB di OpenPGP
è malleabile senza di esso, quindi un messaggio che utilizzava quel pacchetto legacy saltava del tutto il controllo di integrità. Poiché
il tipo di pacchetto è scelto da chi ha prodotto il messaggio, il mittente — o chiunque sia in grado di riscrivere il messaggio in
transito — decideva se il controllo di integrità fosse applicato o meno. L'opzione integrity esistente governa solo il marshalling
e non aveva una controparte lato decifratura, quindi un deployment non poteva richiedere la protezione dell'integrità sui messaggi che
accettava.
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-crypto-pgp 4.22.0 (affetto; corretto in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-crypto-pgp (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.
Il driver di exploit interpreta un mittente (o un intermediario) che produce un messaggio PGP con il pacchetto legacy
cifrando con integrity=false — il testo cifrato risultante non contiene alcun codice di rilevamento delle modifiche. Poi invia
quel messaggio a una route che lo decifra con la chiave segreta.
BENIGN-PGP-PAYLOAD-MARKER-5E1F) restituito — il controllo di integrità
è stato saltato del tutto perché il mittente ha scelto il pacchetto legacy. Il deployment ha accettato un testo cifrato che non poteva
verificare.PGPException — "PGP message is not integrity protected…" —
perché la nuova opzione requireIntegrityProtection è impostata per default su true.I portachiavi (pubring.gpg, secring.gpg, user id e password entrambi sdude) sono le fixture di test pubbliche RSA-2048
dai test camel-crypto-pgp di Apache Camel stesso — materiale inerte, incluso affinché il round-trip sia autosufficiente.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: legacy message decrypts; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85243-crypto-pgp-integrity-downgrade-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"; >>> 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): legacy message decrypts
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: rejected "not integrity protected"
| Proprietà | Valore |
|---|---|
| Componente | camel-crypto-pgp (PGPKeyAccessDataFormat.unmarshal) |
| CWE | CWE-354 (Validazione impropria del valore di controllo dell'integrità) |
| Gravità | MEDIA |
| Vettore di attacco | Un messaggio prodotto con il pacchetto dati legacy cifrato simmetricamente (senza codice di rilevamento delle modifiche) |
| Impatto | Downgrade della verifica dell'integrità: il mittente/intermediario decide se il controllo di integrità viene eseguito; il testo cifrato malleabile viene accettato senza verifica |
| 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-24441 |
| Credito | Claude Security Scan Tool |
Avviso: https://camel.apache.org/security/CVE-2026-85243.html
PGPKeyAccessDataFormat.unmarshal aggiunge un'opzione requireIntegrityProtection
(predefinita a true). Quando un messaggio non è un pacchetto protetto da integrità e l'opzione è abilitata, unmarshal
ora genera PGPException("PGP message is not integrity protected…") invece di decifrarlo. Si noti che
signatureVerificationOption è ancora predefinito a optional, quindi un messaggio privo di firma viene comunque accettato; le
due opzioni insieme sono ciò che conferisce a un messaggio decifrato autenticità e non solo riservatezza. Impostare
requireIntegrityProtection=false solo per interoperare con un mittente che emette ancora il pacchetto legacy, e trattare il
contenuto decifrato come non autenticato.
Rifiutare i messaggi che non utilizzano il pacchetto protetto da integrità prima che raggiungano il data format (ad esempio, ispezionare
l'header del pacchetto OpenPGP in un processor a monte di unmarshal).
Questo repository è pubblicato per scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se ne sono interessati e confermare che l'aggiornamento la risolve. I keyring e il testo in chiaro sono fixture di test pubbliche e inerti. Non utilizzare questo materiale contro sistemi di cui non si è proprietari o gestori.