
Reproducer for CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager unsafe key-metadata deserialization (RCE)
Este projeto demonstra uma vulnerabilidade de desserialização Java no componente camel-pqc do Apache Camel, rastreada como CVE-2026-43867. O método AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() lê metadados de chave pós-quântica persistidos de um segredo do AWS Secrets Manager, decodificando o valor armazenado em Base64 e desserializando-o com um java.io.ObjectInputStream.readObject() bruto e sem ObjectInputFilter — a conversão para KeyMetadata ocorre apenas após readObject() retornar, portanto quaisquer efeitos colaterais de readObject() são executados primeiro. Um principal que pode escrever nesse segredo (secretsmanager:PutSecretValue) pode armazenar um objeto serializado malicioso que é desserializado durante operações normais do ciclo de vida da chave, potencialmente levando à execução de código.
Advisory: https://camel.apache.org/security/CVE-2026-43867.html
Mesmo defeito do CVE-2026-46590 (reportado de forma independente; esse aviso também cobre os gerenciadores irmãos HashiCorp Vault e baseados em arquivo), e um seguimento de correção incompleta do CVE-2026-40048 (CAMEL-23200), que alterou
FileBasedKeyLifecycleManagerpara um formato JSON/PKCS#8/X.509 mas não adicionou umObjectInputFiltere não cobriu os gerenciadores 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) lê o segredo nomeado <keyPrefix>/<keyId>/metadata, analisa seu envelope JSON ({"metadata":"<base64>","keyId":...,"algorithm":...}) e passa o campo metadata para deserializeMetadata. A correção (4.18.3 / 4.21.0) introduz um KeyMetadataCodec compartilhado que armazena metadados como JSON para todos os gerenciadores e restringe as leituras remanescentes de ObjectInputStream legadas com uma lista de permissões ObjectInputFilter.
A vítima é o aplicativo que gerencia chaves PQC com o gerenciador AWS. O atacante é qualquer principal que possa escrever o segredo de metadados (secretsmanager:PutSecretValue). Esta Prova de Conceito usa LocalStack para emular o AWS Secrets Manager; o endpoint /exploit/attack escreve um segredo de metadados malicioso e então aciona o caminho de leitura do gerenciador.
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
Em um ataque real, os bytes serializados são produzidos offline pelo atacante (ex.: com ysoserial). Esta PoC constrói o gadget em processo, e é por isso que a JVM é executada com
--add-opens java.base/java.util=ALL-UNNAMED— um detalhe de construção do gadget, não relacionado à vulnerabilidade.
mvn clean package -DskipTests
docker compose up -d --build
Isso inicia o LocalStack (emulando o AWS Secrets Manager) e o aplicativo reprodutor, que direciona seu AwsSecretsManagerKeyLifecycleManager para o LocalStack via a substituição de 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
Qualquer aplicativo que use AwsSecretsManagerKeyLifecycleManager cujo segredo de metadados de chave possa ser escrito por uma parte diferente da identidade confiável do próprio aplicativo. A desserialização ocorre durante operações comuns do ciclo de vida da chave (getKeyMetadata, loadExistingKeys, listKeys, verificações de rotação, …).
AwsSecretsManagerKeyLifecycleManager do camel-pqc em uma versão afetada.secretsmanager:PutSecretValue nele).commons-collections:3.2.1).Atualize para 4.18.3 / 4.21.0 (CAMEL-23726). Os metadados são armazenados como JSON e quaisquer leituras remanescentes de ObjectInputStream legadas são restritas por um ObjectInputFilter de lista de permissões.
Até a atualização:
secretsmanager:PutSecretValue no segredo de metadados do camel-pqc à própria identidade do aplicativo (IAM de privilégio mínimo).Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada e corrigida publicamente. Não o utilize contra sistemas sem permissão explícita.
| Propriedade | Valor |
|---|
| Componente | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Classe Afetada | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: Desserialização de Dados Não Confiáveis |
| Impacto | Execução de código no aplicativo de gerenciamento de chaves (requer acesso de escrita ao segredo de metadados) |
| Versões Afetadas | From 4.18.0 before 4.18.3, from 4.19.0 before 4.21.0 |
| Versões Corrigidas | 4.18.3, 4.21.0 (camel-pqc não está na linha LTS 4.14.x) |
| JIRA | CAMEL-23726 |
| Reportado por | Venkatraman Kumar (Securin) |