
مُعيد إنتاج قابل للتشغيل لـ Spring Boot وQuarkus من أجل CVE-2026-85257، يوضّح الكشف عن معلومات خطأ SOAP في camel-cxf ويتحقق من إصلاح muteException.
مُعيد إنتاج عملي قابل للتشغيل لثغرة Apache Camel حيث، عندما تفشل مسار خلف مستهلك CXF SOAP
باستثناء لا يعلنه عقد الخدمة، كان يتم وصف الاستثناء مرة أخرى إلى عميل SOAP
في الخطأ: ينسخ CXF الرسالة إلى faultstring الخاص بـ SOAP (ويمكن تهيئته لوضع تتبّع
المكدس في تفاصيل الخطأ). لذلك كان بإمكان متصل خارجي قادر على إحداث فشل أن يقرأ تفاصيل داخلية عن
النشر — أسماء الفئات والحزم، وكل ما تحمله رسالة الاستثناء. الأخطاء المعلنة (المُعلَّمة بـ
@WebFault) أمر مختلف: فهي جزء من العقد المنشور الذي كُتب العملاء وفقًا له، لذا لا تزال
تُبلَّغ بالكامل.
| بيئة التشغيل | الدليل | المكدس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-cxf-soap 4.22.0 (متأثر؛ مُصلَح في 4.22.1)، CXFServlet على Tomcat |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-cxf-soap (Camel 4.15.0، متأثر؛ عنصر التحكم المُصلَح CQ 3.40.0 / Camel 4.22.1) |
كلا الوحدتين تُظهران السلوك المتأثر و السلوك المُصلَح.
يدعم مستهلك CXF SOAP مسارًا يرمي معالجه IllegalStateException غير معلن يحمل تفاصيل
داخلية محاكاة (رمز علامة وعنوان URL داخلي وهمي لـ JDBC). يعمل برنامج التشغيل كعميل SOAP: يستدعي
الخدمة ويقرأ خطأ SOAP المُعاد إليه.
Exchange processing failed — لا يحمل أي فئة أو رسالة أو تتبّع مكدس
لاستثناء المسار (خيار المستهلك الجديد muteException قيمته الافتراضية true). الخطأ الذي يعلنه العقد
(@WebFault) سيظل يُعاد بالكامل.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: fault leaks internal detail; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85257-cxf-fault-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic fault; >>> 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.15.0): fault leaks internal detail
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: generic fault
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-cxf (CxfConsumer، بناء خطأ SOAP) |
| CWE | CWE-209 (توليد رسالة خطأ تحتوي على معلومات حساسة) |
| الخطورة | متوسطة |
| ناقل الهجوم | يستدعي مُتصل SOAP فشل مسار غير معلن ويقرأ تفاصيل الاستثناء من الخطأ |
| التأثير | الكشف عن المعلومات: صنف/رسالة الاستثناء (أسماء المضيفين الداخلية، سلاسل الاتصال، بنية المسار) تصل إلى مُتصل SOAP خارجي |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24477 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85257.html
تُركّب وحدة Spring Boot الـ CXFServlet على Tomcat المضمّن (يتعارض ناقل CXF Jetty المستقل مع إصدار Jetty الذي يديره Spring Boot)، لذا تُقدَّم نقطة نهاية SOAP على
/services/helloعلى المنفذ 8080.
يضيف CxfConsumer خيار المستهلك muteException (القيمة الافتراضية true).
بالنسبة لفشل مسار غير معلن، يبني الآن الخطأ من استثناء بديل Exception("Exchange processing failed")
مع تتبّع مكدّس فارغ، بدلاً من استثناء المسار — بحيث لا يصل أي اسم صنف أو رسالة أو تتبّع مكدّس إلى
المُتصل. يُكتشف الاستثناء الذي يعلنه العقد (@WebFault) ويُبلَّغ عنه بالكامل، لأن كتمه
سيعطّل الخدمة. اضبط muteException=false لاستعادة المخرجات السابقة.
أعلن الاستثناءات المسموح للخدمة بالإبلاغ عنها واربط كل فشل آخر بأحدها في
معالج onException، بحيث لا يصل أي استثناء غير معلن إلى الخطأ.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. رمز العلامة وعنوان URL الخاص بـ JDBC في المسار الفاشل هما عناصر محلية وهمية خاملة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.