
نسخة إثبات مفهوم قابلة للتشغيل بـ Spring Boot وQuarkus تُعيد إنتاج CVE-2026-85296، وهو خلط في مفتاح توقيع MDN عبر الشركاء في camel-as2 (CWE-488)، مع نسخ بناء متأثرة ومُصلحة.
مُعيد إنتاج عملي قابل للتشغيل (proof-of-concept) لثغرة Apache Camel حيث كانت مواد التوقيع الخاصة بكل طلب تُحفظ في
حالة مشتركة بين الطلبات بدلاً من حصرها في الطلب الجاري معالجته. يُسجَّل كائن ResponseMDN واحد
على HttpProcessor المشترك ويخدم كل طلب AS2؛ وفي إعداد المفاتيح الديناميكية (شريك تداول واحد لكل مسار، ولكل منهما
مفاتيحه الخاصة التي تُستخرج لكل طلب من HttpContext) كان الإصدار المتأثر يكتب مفتاح التوقيع المُستخرج لكل طلب
مرة أخرى على حقل في نسخة الكائن (instance field). وحيثما يخدم النشر أكثر من شريك واحد، فإن الطلبات المتزامنة أو
المتتالية قد تتمكن بالتالي من رؤية مواد بعضها البعض، وقد يُوقَّع إشعار التخلص من الرسالة (Message Disposition
Notification) بمفتاح شريك تداول مختلف. ونشرات AS2 متعددة الشركاء بطبيعتها التصميمية، لذا يُبلَغ هذا الشرط
بحركة مرور متزامنة عادية.
| بيئة التشغيل | الدليل | الحزمة التقنية |
|---|---|---|
| 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.39.0 + camel-quarkus-as2 (Camel 4.22.0، متأثر؛ ضابط التحكم المُصلَح CQ 3.40.0 / Camel 4.22.1) |
كلا الوحدتين تُظهران السلوك المتأثر و السلوك المُصلَح.
يستخدم برنامج التشغيل كائن ResponseMDN الحقيقي (اعتراض استجابة AS2) في صيغته ذات المفاتيح الديناميكية. ويستخرج
مواد التوقيع الخاصة بشريكين بالتناوب — الشريك A ثم الشريك B — عبر ResponseMDN.process(...) (كل منهما بمفتاح RSA
الخاص بذلك الشريك في HttpContext)، ويقرأ حقل signingPrivateKey في نسخة الكائن بعد كل منهما.
final ولا يُكتب فيه أبداً؛ يبقى المفتاح الخاص بكل طلب محصوراً في الطلب، لذا يبقى
signingPrivateKey في النسخة المشتركة null.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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): per-request key on the shared instance
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: field stays null
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-as2 (معالجة المفاتيح الديناميكية في ResponseMDN) |
| CWE | CWE-488 (كشف عنصر بيانات لجلسة خاطئة) |
| الخطورة | متوسطة |
| ناقل الهجوم | حركة AS2 متزامنة عادية عبر نشر متعدد الشركاء يتشارك نسخة ResponseMDN واحدة |
| التأثير | إشعار إيداع رسالة (Message Disposition Notification) موقّع بمفتاح خاص لشريك تجاري آخر؛ إعادة استخدام مواد التوقيع بين الشركاء |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24429 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85296.html
الوحدة المتأثرة في Quarkus مبنية على CQ 3.39.0 (Camel 4.22.0): آلية مفتاح توقيع AS2 الديناميكي لكل طلب التي يختبرها هذا PoC تأتي بعد CQ 3.29.0 (Camel 4.15.0)، لذا فإن CQ 3.39.0 يشحن نفس Camel 4.22.0 الموجود في وحدة Spring Boot.
يجعل ResponseMDN حقول الأمان المُهيّأة final ويحلّل
المواد الديناميكية لكل طلب إلى متغيرات محلية داخل process()، دون كتابتها أبدًا مرة أخرى إلى حقول النسخة. وبالتالي
لم يعد بإمكان نسخة مشتركة واحدة تسريب مفتاح توقيع طلب إلى طلب آخر.
شغّل سياق Camel منفصلًا لكل شريك تجاري بحيث لا تُشارك أي مواد توقيع بينهم.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلها. تُولَّد أزواج مفاتيح RSA داخل العملية لأغراض العرض التوضيحي وهي غير فعّالة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.