
نموذج إثبات مفهوم قابل للتشغيل بـ Spring Boot للثغرة CVE-2026-83531، يوضح حقن تعبيرات اللغة في نقطة نهاية dynamic-router-control الخاصة بـ Apache Camel ويتحقق من الإصلاح.
مُعيد إنتاج عملي قابل للتشغيل لثغرة Apache Camel حيث كانت نقطة نهاية dynamic-router-control
تأخذ المُحدِّد (predicate) الخاص بالاشتراك واسم اللغة المستخدمة في تصريفه من الرسالة
الواردة (حقول predicate / expressionLanguage في DynamicRouterControlMessage، أو ترويسات
CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage). ثم كانت الخدمة تحلّ تلك
اللغة من CamelContext وتُصرّف التعبير إلى Predicate، دون قائمة سماح ودون اشتراك صريح. كان
المُحدِّد المُصرَّف يُقيَّم مقابل كل تبادل يُوجَّه عبر القناة — لذا فإن أي فاعل قادر على إرسال رسالة
على ناقل تقوم مساره بإعادة توجيهها إلى نقطة تحكم نهاية يمكنه تقديم تعبير من اختياره، يُقيَّم
بامتيازات عملية Camel. كان يمكن اختيار أي لغة على مسار الفئات (classpath)، بما في ذلك simple،
التي تكون موجودة دائمًا وكانت الافتراضية.
Camel Spring Boot فقط. لا يوجد امتداد
camel-quarkus-dynamic-router، لذا لا يمكن تشغيل مُعيد الإنتاج هذا على Camel Quarkus.
| بيئة التشغيل | الدليل | المكدّس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0 (متأثرة؛ مُصلحة في 4.22.1) |
يُهيّئ التطبيق قناة Dynamic Router باسم test (direct:start → dynamic-router://test). يرسل
المهاجم رسالة تحكم subscribe تحمل تعبير مُحدِّد ولغة يختارهما المهاجم:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
ثم يتم توجيه رسالة واحدة عبر القناة، والتي تقوم بتقييم محمول الاشتراك. في البنية المتأثرة يُنفَّذ التعبير، مستدعيًا detonator.detonate() — وهو بديل حميد لأي طريقة تسجيل بدون وسائط قد يصل إليها المهاجم (وأي لغة، مثل Groovy، تتيح تنفيذ تعليمات برمجية عشوائية). في البنية المُصلحة ترفض نقطة النهاية التحكمية أخذ المحمول/اللغة من الرسالة.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
على البناء المُصلَّح، يُرفض الاشتراك مع IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ....
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-dynamic-router (نقطة النهاية dynamic-router-control) |
| CWE | CWE-94 (حقن الشيفرة)، CWE-917 (حقن لغة التعبيرات) |
| الخطورة | عالية |
| ناقل الهجوم | رسالة تحكم (subscribe/update) تُقدِّم تعبير predicate ولغة، عبر ناقل يقوم مساره بتمريرها إلى نقطة نهاية dynamic-router-control |
| التأثير | تقييم تعبير يختاره المهاجم (أي لغة متاحة على classpath) بصلاحيات عملية Camel — تنفيذ شيفرة |
| الإصدارات المتأثرة | من 4.4.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلَّحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24576 |
| الفضل | Leon Zlobecki |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-83531.html
لم يعد تعبير predicate ولغته يُؤخذان من رسالة التحكم افتراضيًا: تُرفض رسالة التحكم التي تُقدِّمهما ما لم
يُفعِّل مؤلف المسار ذلك صراحةً عبر allowPredicateFromMessage=true على نقطة النهاية dynamic-router-control.
المسار المقصود هو تهيئة predicate وexpressionLanguage على URI الخاص بنقطة النهاية (خاضع لتحكم مؤلف المسار)،
كما كانت الإصدارات السابقة لـ 4.4.0 تفعل.
لا تمرِّر الرسائل ذات المنشأ الخارجي إلى نقطة نهاية dynamic-router-control؛ وأدِر الاشتراكات فقط من
نقاط النهاية الخاضعة لتحكم مؤلف المسار، وقيِّد النواقل التي يمكنها الوصول إلى قناة التحكم.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. الحمولة عبارة عن bean علامة غير ضار. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.