
Riproduttore per CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager deserializzazione non sicura dei metadati delle chiavi (RCE)
Questo progetto dimostra una vulnerabilità di deserializzazione Java nel componente camel-pqc di Apache Camel,
tracciata come CVE-2026-43867. AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() legge i metadati
delle chiavi post-quantum persistiti da un segreto di AWS Secrets Manager decodificando in Base64 il valore
memorizzato e deserializzandolo con un java.io.ObjectInputStream.readObject() grezzo e nessun
ObjectInputFilter — il cast a KeyMetadata avviene solo dopo il ritorno di readObject(), quindi qualsiasi
effetto collaterale di readObject() viene eseguito prima. Un principale che può scrivere in quel segreto
(secretsmanager:PutSecretValue) può memorizzare un oggetto serializzato manipolato che viene deserializzato
durante le normali operazioni del ciclo di vita delle chiavi, portando potenzialmente a esecuzione di codice.
Advisory: https://camel.apache.org/security/CVE-2026-43867.html
Stesso difetto di CVE-2026-46590 (segnalato indipendentemente; quell'avviso copre anche i gestori fratelli HashiCorp Vault e basati su file), e un follow-up di correzione incompleta per CVE-2026-40048 (CAMEL-23200), che ha cambiato
FileBasedKeyLifecycleManagerin un formato JSON/PKCS#8/X.509 ma non ha aggiunto unObjectInputFiltere non ha coperto i gestori AWS/Vault.
// AwsSecretsManagerKeyLifecycleManager - affected 4.18.2
private KeyMetadata deserializeMetadata(String base64) throws Exception {
byte[] data = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) { // NO ObjectInputFilter
return (KeyMetadata) ois.readObject(); // gadget fires here, before the cast
}
}
getKeyMetadata(keyId) legge il segreto chiamato <keyPrefix>/<keyId>/metadata, analizza il suo involucro JSON
({"metadata":"<base64>","keyId":...,"algorithm":...}), e passa il campo metadata a deserializeMetadata.
La correzione (4.18.3 / 4.21.0) introduce un KeyMetadataCodec condiviso che memorizza i metadati come JSON per
tutti i gestori e limita le restanti letture legacy di ObjectInputStream con un ObjectInputFilter di whitelist.
La vittima è l'applicazione che gestisce le chiavi PQC con il gestore AWS. L'attaccante è qualsiasi
principale che può scrivere il segreto dei metadati (secretsmanager:PutSecretValue). Questo PoC utilizza
LocalStack per emulare AWS Secrets Manager; l'endpoint /exploit/attack scrive un segreto di metadati
manipolato e poi guida il percorso di lettura del gestore.
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # runs the app (--add-opens for gadget build)
├── docker-compose.yml # LocalStack (Secrets Manager) + the reproducer app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # CommonsCollections6 gadget, fires during readObject()
│ └── ExploitController.java # writes the crafted secret, then calls getKeyMetadata()
└── resources/
└── application.properties
In un attacco reale i byte serializzati sono prodotti offline dall'attaccante (ad es. con ysoserial). Questo PoC costruisce il gadget in-process, motivo per cui la JVM viene eseguita con
--add-opens java.base/java.util=ALL-UNNAMED— un dettaglio di costruzione del gadget, non correlato alla vulnerabilità.
mvn clean package -DskipTests
docker compose up -d --build
Questo avvia LocalStack (emulando AWS Secrets Manager) e l'app riproduttrice, che punta il suo
AwsSecretsManagerKeyLifecycleManager a LocalStack tramite l'override dell'endpoint.
curl -s http://localhost:8080/exploit/attack
# -> Wrote crafted serialized metadata to AWS Secrets Manager secret 'pqc/keys/victim-key/metadata'.
# getKeyMetadata() threw java.lang.ClassCastException (expected — the gadget runs during readObject ...)
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-43867 ls -la /tmp/pwned
docker compose down
Qualsiasi applicazione che utilizza AwsSecretsManagerKeyLifecycleManager il cui segreto dei metadati delle
chiavi può essere scritto da un soggetto diverso dall'identità fidata dell'applicazione stessa. La
deserializzazione viene eseguita durante le normali operazioni del ciclo di vita delle chiavi (getKeyMetadata,
loadExistingKeys, listKeys, controlli di rotazione, …).
AwsSecretsManagerKeyLifecycleManager di camel-pqc su una versione affetta.secretsmanager:PutSecretValue su di esso).commons-collections:3.2.1).Aggiorna a 4.18.3 / 4.21.0 (CAMEL-23726). I metadati sono memorizzati come JSON e qualsiasi lettura legacy
rimanente di ObjectInputStream è vincolata da un ObjectInputFilter di whitelist.
Fino all'aggiornamento:
secretsmanager:PutSecretValue sul segreto dei metadati camel-pqc all'identità dell'applicazione stessa
(IAM con privilegi minimi).Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non utilizzarlo contro sistemi senza autorizzazione esplicita.
| Proprietà | Valore |
|---|
| Componente | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Classe Affetta | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: Deserialization of Untrusted Data |
| Impatto | Esecuzione di codice nell'applicazione di gestione delle chiavi (richiede accesso in scrittura al segreto dei metadati) |
| Versioni Affette | Da 4.18.0 prima di 4.18.3, da 4.19.0 prima di 4.21.0 |
| Versioni Corrette | 4.18.3, 4.21.0 (camel-pqc non è sulla linea LTS 4.14.x) |
| JIRA | CAMEL-23726 |
| Segnalatore | Venkatraman Kumar (Securin) |