
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-80344 في Apache Camel camel-as2، تُوضّح SSRF غير المتزامن في MDN والكشف عن بيانات الاعتماد باستخدام إصدارات متأثرة ومُصلحة.
مُعيد إنتاج عملي قابل للتشغيل (proof-of-concept) لثغرة Apache Camel حيث كان مستقبل AS2 يُسلِّم إشعار التصرف في الرسالة (MDN) غير المتزامن إلى عنوان يُقدِّمه المُرسِل (وهو Receipt-Delivery-Option)، دون أي قيد. لذلك يختار الشريك البعيد المضيف الذي يتصل به مثيل Camel عند تسليم MDN — تزوير طلب من جهة الخادم (server-side request forgery) من موقع مستقبل AS2، يصل إلى مضيفين لا يمكن الوصول إليهم إلا من داخل شبكة النشر — وحيثما كان تسليم MDN مُهيَّأً ببيانات اعتماد، فإن تلك البيانات تُقدَّم إلى الوجهة التي اختارها المهاجم.
| بيئة التشغيل | الدليل | المكدّس التقني |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-as2 3.29.0 (Camel 4.15.0، متأثر؛ عنصر التحكم المُصلَح 3.40.0 / Camel 4.22.1) |
يشغّل التطبيق، داخل JVM واحدة:
as2://server/listen، المنفذ 8888) مُهيَّأ ببيانات اعتماد تسليم MDN؛as2://client/send) الذي يرسل رسالة AS2 واحدة غير موقَّعة (PLAIN) يطلب MDN غير متزامن، مع receiptDeliveryOption يشير إلى عنوان URL داخلي فقط (127.0.0.1:9099، وهو منفذ لا ينشره Docker — ليمثّل مضيفًا لا يمكن الوصول إليه إلا من داخل النشر)؛في البناء المتأثر يتصل المستقبل بعنوان URL الداخلي الذي اختاره المهاجم لتسليم MDN ويُقدِّم بيانات اعتماد تسليم MDN الخاصة به (Authorization: Basic …) إليه. في البناء المُصلَح تُحجَب تلك البيانات (تُرفَق فقط بالمضيفين المدرجين في قائمة السماح)، ويقيّد الخيار الجديد asyncMdnAllowedHosts مضيف التسليم بالكامل.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
Internal host connections observed:
POST /internal-mdn-sink (Authorization=Basic bWRuLXBhcnRuZXItdXNlcjpNRE4tREVMSVZFUlktU0VDUkVU)
>>> PROVEN: the AS2 receiver connected to the sender-chosen internal URL to deliver the async MDN
>>> (server-side request forgery) AND presented its configured MDN-delivery credentials ...
(تتحلل قيمة Authorization إلى mdn-partner-user:MDN-DELIVERY-SECRET.) في البناء المُصلح، يُظهر الاتصال
Authorization=null — لم تعد بيانات الاعتماد تُقدَّم إلى المضيف الذي يختاره المُرسِل.
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-as2 |
| CWE | CWE-918 (تزوير الطلبات من جانب الخادم)؛ الكشف عن بيانات الاعتماد (CWE-200) |
| الخطورة | عالية |
| ناقل الهجوم | مُرسِل AS2 يطلب MDN غير متزامن بعنوان Receipt-Delivery-Option يختاره المهاجم |
| التأثير | تزوير الطلبات من جانب الخادم من المُستقبِل (الوصول إلى المضيفين الداخليين)؛ الكشف عن بيانات اعتماد تسليم MDN إلى المضيف الذي يختاره المهاجم |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24417 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-80344.html
أصبحت وجهة MDN غير المتزامنة مقيَّدة الآن بدلاً من أخذها حرفياً من الرسالة الواردة. خيار جديد
asyncMdnAllowedHosts (التسمية security) يضع المضيفين المسموح بتسليم MDN إليهم في قائمة سماح، وتُرفَق
بيانات اعتماد تسليم MDN المُهيَّأة فقط عندما تكون الوجهة ضمن قائمة السماح — لذا افتراضياً
(بدون قائمة سماح) لا تُقدَّم بيانات الاعتماد أبداً إلى مضيف يختاره المُرسِل.
قيِّد الاتصال الصادر من مُستقبِل AS2 إلى نقاط نهاية الشركاء التي يسلّم إليها الإيصالات بشكل مشروع، ولا تُرفِق بيانات اعتماد بتسليم MDN تكون صالحة لأي مضيف غير هؤلاء الشركاء.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. "بيانات الاعتماد" و الوجهة الداخلية هي عناصر محلية خاملة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.