
Reproducer for CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager unsafe key-metadata deserialization (RCE)
Dieses Projekt demonstriert eine Java-Deserialisierungsschwachstelle in der Apache Camel-Komponente camel-pqc,
die als CVE-2026-43867 geführt wird. AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() liest persistierte
Post-Quanten-Schlüsselmetadaten aus einem AWS Secrets Manager-Secret zurück, indem der gespeicherte Wert Base64-decodiert und
mit einem rohen java.io.ObjectInputStream.readObject() deserialisiert wird, ohne ObjectInputFilter — der Cast
zu KeyMetadata erfolgt erst nachdem readObject() zurückkehrt, sodass alle readObject()-Nebeneffekte zuerst ausgeführt werden. Ein
Principal, der in dieses Secret schreiben kann (secretsmanager:PutSecretValue), kann ein präpariertes serialisiertes Objekt
ablegen, das bei normalen Schlüssellebenszyklus-Operationen deserialisiert wird, was potenziell zu Codeausführung führt.
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-43867.html
Gleicher Fehler wie CVE-2026-46590 (unabhängig gemeldet; dieses Advisory deckt auch die HashiCorp Vault- und dateibasierten verwandten Manager ab) und eine unvollständige Korrektur-Nachfolge zu CVE-2026-40048 (CAMEL-23200), die
FileBasedKeyLifecycleManagerauf ein JSON/PKCS#8/X.509-Format umgestellt, aber keinenObjectInputFilterhinzugefügt und die AWS/Vault-Manager nicht abgedeckt hat.
// AwsSecretsManagerKeyLifecycleManager - betroffen 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)) { // KEIN ObjectInputFilter
return (KeyMetadata) ois.readObject(); // Gadget wird hier aktiv, vor dem Cast
}
}
getKeyMetadata(keyId) liest das Secret namens <keyPrefix>/<keyId>/metadata, parst seinen JSON-Envelope
({"metadata":"<base64>","keyId":...,"algorithm":...}) und übergibt das metadata-Feld an
deserializeMetadata. Der Fix (4.18.3 / 4.21.0) führt einen gemeinsamen KeyMetadataCodec ein, der Metadaten als
JSON für alle Manager speichert und die verbleibenden Legacy-ObjectInputStream-Lesevorgänge mit einer Whitelist
ObjectInputFilter einschränkt.
Das Opfer ist die Anwendung, die PQC-Schlüssel mit dem AWS-Manager verwaltet. Der Angreifer ist jeder Principal,
der das Metadaten-Secret beschreiben kann (secretsmanager:PutSecretValue). Dieser PoC verwendet LocalStack, um AWS
Secrets Manager zu emulieren; der /exploit/attack-Endpunkt schreibt ein präpariertes Metadaten-Secret und treibt dann den
Lesepfad des Managers an.
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # führt die App aus (--add-opens für Gadget-Bau)
├── docker-compose.yml # LocalStack (Secrets Manager) + die Reproducer-App
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # CommonsCollections6-Gadget, wird während readObject() ausgelöst
│ └── ExploitController.java # schreibt das präparierte Secret, ruft dann getKeyMetadata() auf
└── resources/
└── application.properties
In einem realen Angriff werden die serialisierten Bytes offline vom Angreifer erzeugt (z. B. mit ysoserial). Dieser PoC baut das Gadget prozessintern, weshalb die JVM mit
--add-opens java.base/java.util=ALL-UNNAMEDläuft — ein Detail des Gadget-Baus, nicht zusammenhängend mit der Schwachstelle.
mvn clean package -DskipTests
docker compose up -d --build
Dies startet LocalStack (emuliert AWS Secrets Manager) und die Reproducer-App, die ihren
AwsSecretsManagerKeyLifecycleManager über den Endpunkt-Override auf LocalStack ausrichtet.
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
Jede Anwendung, die AwsSecretsManagerKeyLifecycleManager verwendet und deren Schlüsselmetadaten-Secret von einer anderen
Partei als der eigenen vertrauenswürdigen Identität beschrieben werden kann. Die Deserialisierung erfolgt während normaler
Schlüssellebenszyklus-Operationen (getKeyMetadata, loadExistingKeys, listKeys, Rotationsprüfungen, …).
AwsSecretsManagerKeyLifecycleManager in einer betroffenen Version verwendet.secretsmanager:PutSecretValue darauf).commons-collections:3.2.1).Upgrade auf 4.18.3 / 4.21.0 (CAMEL-23726). Metadaten werden als JSON gespeichert und alle verbleibenden Legacy-
ObjectInputStream-Lesevorgänge werden durch einen Whitelist-ObjectInputFilter eingeschränkt.
Bis zum Upgrade:
secretsmanager:PutSecretValue auf das camel-pqc-Metadaten-Secret auf die eigene Identität der Anwendung
(Least-Privilege-IAM).Dieser Reproducer wird ausschließlich für Sicherheitsforschung und autorisierte Tests bereitgestellt, für eine öffentlich offengelegte und behobene Schwachstelle. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.
| Eigenschaft | Wert |
|---|
| Komponente | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Betroffene Klasse | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: Deserialisierung nicht vertrauenswürdiger Daten |
| Auswirkung | Codeausführung in der schlüsselverwaltenden Anwendung (erfordert Schreibzugriff auf das Metadaten-Secret) |
| Betroffene Versionen | Von 4.18.0 vor 4.18.3, von 4.19.0 vor 4.21.0 |
| Behobene Versionen | 4.18.3, 4.21.0 (camel-pqc befindet sich nicht auf dem 4.14.x LTS-Zweig) |
| JIRA | CAMEL-23726 |
| Gemeldet von | Venkatraman Kumar (Securin) |