
Prova de conceito executável em Spring Boot e Quarkus para a CVE-2026-85243, demonstrando o downgrade da verificação de integridade do camel-crypto-pgp do Apache Camel e sua correção.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o unmarshal() do formato de dados PGP
verificava o código de detecção de modificação apenas quando a mensagem usava o pacote de dados protegido por integridade
criptografado simetricamente do OpenPGP. O antigo pacote de dados criptografado simetricamente não carrega esse código, e o modo CFB do OpenPGP
é maleável sem ele, portanto uma mensagem que usava esse pacote legado ignorava completamente a verificação de integridade. Como
o tipo de pacote é escolhido por quem produziu a mensagem, o remetente — ou qualquer pessoa capaz de reescrever a mensagem em
trânsito — decidia se a verificação de integridade se aplicava ou não. A opção integrity existente governa apenas a marshalling
e não tinha contrapartida no lado da descriptografia, portanto uma implantação não podia exigir proteção de integridade nas mensagens que
aceitava.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-crypto-pgp 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-crypto-pgp (Camel 4.15.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido.
O driver de exploração desempenha o papel de um remetente (ou de um intermediário) que produz uma mensagem PGP com o pacote legado
criptografando com integrity=false — o texto cifrado resultante não carrega código de detecção de modificação. Em seguida, alimenta
essa mensagem a uma rota que a descriptografa com a chave secreta.
BENIGN-PGP-PAYLOAD-MARKER-5E1F) é retornado — a verificação de integridade
foi completamente ignorada porque o remetente escolheu o pacote legado. A implantação aceitou texto cifrado que não conseguia
verificar.PGPException — "PGP message is not integrity protected…" —
porque a nova opção requireIntegrityProtection tem como padrão true.Os chaveiros (pubring.gpg, secring.gpg, id de usuário e senha ambos sdude) são os fixtures de teste RSA-2048 públicos
dos próprios testes camel-crypto-pgp do Apache Camel — material inerte, incluído para que a ida e volta seja autocontida.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: legacy message decrypts; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85243-crypto-pgp-integrity-downgrade-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): legacy message decrypts
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"
| Propriedade | Valor |
|---|---|
| Componente | camel-crypto-pgp (PGPKeyAccessDataFormat.unmarshal) |
| CWE | CWE-354 (Validação Imprópria do Valor de Verificação de Integridade) |
| Severidade | MÉDIA |
| Vetor de ataque | Uma mensagem produzida com o pacote de dados criptografados simetricamente legado (sem código de detecção de modificação) |
| Impacto | Rebaixamento da verificação de integridade: o remetente/intermediário decide se a verificação de integridade é executada; texto cifrado maleável é aceito sem verificação |
| Versões Afetadas | A partir de 4.0.0 antes de 4.18.5, a partir de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24441 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85243.html
PGPKeyAccessDataFormat.unmarshal adiciona uma opção requireIntegrityProtection
(padrão true). Quando uma mensagem não é um pacote protegido por integridade e a opção está habilitada, unmarshal
agora lança PGPException("PGP message is not integrity protected…") em vez de descriptografá-la. Observe que
signatureVerificationOption ainda tem como padrão optional, portanto uma mensagem sem assinatura ainda é aceita; as
duas opções juntas são o que conferem autenticidade a uma mensagem descriptografada, e não apenas confidencialidade. Defina
requireIntegrityProtection=false apenas para interoperar com um remetente que ainda emite o pacote legado, e trate o
conteúdo descriptografado como não autenticado.
Rejeite mensagens que não usam o pacote protegido por integridade antes que elas cheguem ao data format (por exemplo, inspecione
o cabeçalho do pacote OpenPGP em um processor antes do unmarshal).
Este repositório é publicado para fins educacionais e defensivos: para ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. Os keyrings e o texto em claro são fixtures de teste públicos e inertes. Não use este material contra sistemas que você não possui ou opera.