
مُعيد إنتاج إثبات مفهوم قابل للتشغيل لـ CVE-2026-85312، يُظهر اختطاف saga في Apache Camel عبر ترويسة Long-Running-Action في Spring Boot وQuarkus.
Long-Running-Actionمُعيد إنتاج قابل للتشغيل (proof-of-concept) لثغرة Apache Camel حيث كان SagaProcessor في camel-core يختار
منسّق الـ saga من ترويسة الرسالة Long-Running-Action في كل exchange. اسم هذه الترويسة لا يحمل بادئة
Camel، لذا فهو يقع خارج مساحة الأسماء التي تُزيلها مرشّحات ترويسات المستهلك — إذ كان بإمكان مُرسِل خارجي تزويدها
على رسالة واردة وبالتالي تسمية الـ saga التي ينضم إليها الـ exchange الخاص به، فيربط طلبه بإجراء طويل الأمد
بدأه شخص آخر (أو يربط التعويض بإجراء لم يبدأه هو). يقتصر التعرّض على عمليات النشر التي تشغّل sagas، لكن حيثما ينطبق
فإن المُرسِل يتحكم في أي saga ينتمي إليه الـ exchange (CWE-20).
| بيئة التشغيل | الدليل | الحزمة التقنية |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.22.0 (متأثرة؛ مُصلحة في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-saga (Camel 4.22.0، متأثرة؛ ضابط مُصلح CQ 3.40.0 / Camel 4.22.1) |
يُظهر كلا الوحدتين السلوك المتأثر و السلوك المُصلح مقابل SagaProcessor الحقيقي في camel-core.
يحاكي برنامج التشغيل اختبار الانحدار الخاص بالإصلاح نفسه (SagaHeaderCannotSelectCoordinatorTest). فهو يبني مسار saga
from("direct:…").saga().propagation(MANDATORY) مدعومًا بخدمة saga في الذاكرة تسجّل كل معرّف يُطلب منها
حلّه، ثم يرسل exchange واحدًا يحمل الترويسة الواردة Long-Running-Action = a-saga-id-from-the-wire
— وهو المعرّف الذي سيضعه مُرسِل خارجي على الشبكة. المعيار ببساطة هو أي معرّفات saga تصل إلى الخدمة:
a-saga-id-from-the-wire
— أي أن الرسالة اختارت المنسّق.في كلا البنائين يفشل الـ exchange ذو MANDATORY في النهاية (لا توجد saga حقيقية للانضمام إليها) — فالثغرة ليست في
الفشل بل في أن معرّفًا اختاره المهاجم استُخدم لاختيار المنسّق على الإطلاق، ولهذا يراقب المعيار عملية البحث
بدلًا من النتيجة.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wire id looked up = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85312-saga-header-hijack-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false; >>> 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): wire id looked up = true
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: wire id looked up = false
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-core (SagaProcessor.getCurrentSagaCoordinator) |
| CWE | CWE-20 (التحقق غير السليم من المدخلات) |
| الخطورة | متوسطة |
| ناقل الهجوم | يوفّر مُرسِل خارجي ترويسة Long-Running-Action غير المُسبَّقة على رسالة واردة إلى مسار يشغّل نمط saga EIP |
| التأثير | يحدّد المُرسِل اسم الـ saga التي ينضم إليها التبادل — إما بالارتباط بإجراء طويل الأمد يخص طرفًا آخر، أو بإساءة ربط التعويض |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلَحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24449 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85312.html
الوحدة المتأثرة في Quarkus مبنية على CQ 3.39.0 (Camel 4.22.0). أما الضابط المُرقَّع فهو CQ 3.40.0 (Camel 4.22.1).
أصبح SagaProcessor يتحقق من ترويسة Long-Running-Action فقط عندما
تُعلن خدمة الـ saga أنها تشارك في مثل هذا البروتوكول، وذلك عبر الدالة الجديدة
CamelSagaService.isLongRunningActionHeaderSupported() (القيمة الافتراضية false؛ وتتجاوزها خدمة LRA لتصبح true). تبقى
حالة التبادل الداخلية — التي تصمد أمام removeHeaders("*") — هي الحامل الطبيعي لمعرّف الـ saga، لذا لم يعد بإمكان رسالة
أن تختار المنسّق لخدمة لا تشغّل أي منسّق خارجي.
أزل الترويسة عند حدود الثقة باستخدام removeHeaders("Long-Running-Action") على كل مستهلك يقبل
رسائل من مُرسِل غير موثوق.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. تشغّل النسخة التوضيحية مسار saga داخل العملية باستخدام خدمة saga في الذاكرة؛ ومعرّف الـ saga الخاص بـ "المهاجم" هو نص بديل غير ضار. لا تستخدم هذه المادة ضد أنظمة لا تملكها أو لا تديرها.