
Prova de conceito executável em Spring Boot e Quarkus que reproduz o CVE-2026-85296, uma confusão de chave de assinatura MDN entre parceiros no camel-as2 (CWE-488), com builds afetados e corrigidos.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o material de assinatura por requisição era mantido em
estado compartilhado entre requisições em vez de confinado à requisição que estava sendo processada. Um único ResponseMDN é
registrado no HttpProcessor compartilhado e atende todas as requisições AS2; na configuração de chaves dinâmicas (um parceiro comercial
por caminho, cada um com suas próprias chaves resolvidas por requisição a partir do HttpContext), a build afetada gravava a
chave de assinatura resolvida por requisição de volta em um campo de instância. Onde uma implantação atende mais de um parceiro,
requisições concorrentes ou sucessivas podiam, portanto, observar o material umas das outras, e uma Message Disposition
Notification podia ser assinada com a chave de um parceiro comercial diferente. Implantações AS2 são tipicamente
multi-parceiro por design, então a condição é atingida por tráfego concorrente comum.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-as2 (Camel 4.22.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 usa o ResponseMDN real (o interceptor de resposta AS2) em sua forma de chaves dinâmicas. Ele resolve o material de assinatura de dois
parceiros em sequência — Parceiro A, depois Parceiro B — através de ResponseMDN.process(...) (cada um com a chave RSA desse
parceiro no HttpContext), e lê o campo signingPrivateKey da instância após cada um.
final e nunca é escrito; a chave por requisição permanece confinada à requisição, então o
signingPrivateKey da instância compartilhada permanece null.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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.22.0): per-request key on the shared instance
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: field stays null
| Propriedade | Valor |
|---|---|
| Componente | camel-as2 (manipulação de chaves dinâmicas de ResponseMDN) |
| CWE | CWE-488 (Exposição de Elemento de Dados à Sessão Errada) |
| Severidade | MÉDIA |
| Vetor de ataque | Tráfego AS2 concorrente comum em uma implantação multi-parceiro que compartilha uma única instância de ResponseMDN |
| Impacto | Uma Notificação de Disposição de Mensagem assinada com a chave privada de outro parceiro comercial; reutilização de material de assinatura entre parceiros |
| 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-24429 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85296.html
O módulo afetado do Quarkus é construído sobre o CQ 3.39.0 (Camel 4.22.0): o mecanismo dinâmico de chave de assinatura AS2 por requisição que este PoC exercita é posterior ao CQ 3.29.0 (Camel 4.15.0), portanto o CQ 3.39.0 entrega o mesmo Camel 4.22.0 que o módulo Spring Boot.
ResponseMDN torna os campos de segurança configurados final e resolve
o material dinâmico por requisição em variáveis locais dentro de process(), nunca gravando-o de volta nos campos da instância. Uma
única instância compartilhada, portanto, não pode mais vazar a chave de assinatura de uma requisição para outra.
Execute um contexto Camel separado por parceiro comercial, para que nenhum material de assinatura seja compartilhado entre eles.
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 pares de chaves RSA são gerados em processo para a demonstração e são inertes. Não use este material contra sistemas que você não possui ou opera.