
نموذج إثبات مفهوم قابل للتشغيل بـ Spring Boot يعيد إنتاج CVE-2026-85245، وهو كشف بيانات عبر التبادل في camel-thrift، مع مقارنة بين النسخة المتأثرة والنسخة المُصلحة وملاحظات التخفيف.
مُعيد إنتاج قابل للتشغيل لإثبات المفهوم لثغرة Apache Camel حيث كان تنسيق بيانات Thrift يُجرى فك تسلسله (unmarshal)
إلى defaultInstance المشترك الخاص بالنوع الهدف بدلاً من نسخة جديدة، ويُعيد ذلك الكائن المشترك
كجسم التبادل (exchange body). ولأن النسخة مشتركة على مستوى العملية بأكملها، فإن الحالة المكتوبة أثناء فك تسلسل رسالة واحدة
بقيت على الكائن وكانت مرئية لكل رسالة لاحقة تستخدم النوع نفسه. الحقول الغائبة من حمولة لاحقة
احتفظت بقيم الرسالة السابقة، لذا كان يمكن قراءة محتوى يخص مُرسِلًا ما أثناء معالجة رسالة مُرسِل آخر،
وكان بإمكان التبادلات المتزامنة أن ترى حالة بعضها البعض المكتوبة جزئيًا. في
نشر يخدم أكثر من مستأجر أو مستخدم عبر المسار نفسه، يُعد ذلك كشفًا لبيانات طرف لطرف آخر.
Spring Boot فقط. لا يوجد امتداد
camel-quarkus-thrift، لذا يشحن مُعيد الإنتاج هذا وحدة Camel Spring Boot واحدة. (العيب فيThriftDataFormatالخاص بالمكوّن، وهو مستقل عن بيئة التشغيل.)
| بيئة التشغيل | الدليل | الحزمة التقنية |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
يُعرّف المسار (route) كائن ThriftDataFormat واحدًا (مدعومًا بنوع Thrift المُولَّد Work) ويعيد استخدامه لكل رسالة،
كما تفعل المسارات عادةً. يُرسل مستأجران رسالة عبره:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — يحمل الحقل الاختياري comment بيانات
حساسة؛Work{num1=3, op=SUBTRACT} — بدون حقل comment.يفك المسار تسلسل رسالة المستأجر A، ثم رسالة المستأجر B.
comment الخاص بالمستأجر A — فـ Thrift يُسنِد فقط
الحقول الموجودة في البايتات الواردة، وقد جرى إلغاء تسلسل كلتا الرسالتين إلى (وأُعيدتا كـ) النسخة المشتركة
نفسها، لذا احتفظ حقل B الغائب بقيمة A. الجسمان هما حرفيًا الكائن نفسه.comment الخاص بالمستأجر B هو null — يحصل كل تبادل على نسخته الخاصة المُنظَّفة.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (كشف عنصر بيانات لجلسة خاطئة) |
| الخطورة | متوسطة |
| ناقل الهجوم | رسالتان من نفس نوع Thrift عبر مسار واحد؛ رسالة لاحقة تحذف حقلاً ترث قيمة الرسالة السابقة |
| التأثير | كشف بيانات بين التبادلات / بين المستأجرين؛ يمكن للتبادلات المتزامنة أن ترى الحالة المكتوبة جزئياً لبعضها البعض |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، من 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24442 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85245.html
أنواع Thrift المولّدة (Work، Operation) هي عناصر الاختبار العامة من اختبارات camel-thrift الخاصة بـ Apache Camel.
يقوم ThriftDataFormat.unmarshal الآن بإلغاء التسلسل إلى نسخة خاصة بكل تبادل:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — ثم يلغي تسلسل البايتات إلى instance ويعيدها. يحصل كل تبادل على كائن خاص به تم مسحه، بحيث لا ينتقل أي حقل بين الرسائل ولا يتشارك تبادلان في جسم واحد.
انسخ الجسم بعد إلغاء تسلسله إلى نسخة جديدة فوراً بعد تشغيل صيغة البيانات، ولا تحتفظ بمراجع إلى الكائن المُعاد.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلها. "السر" هو سلسلة علامة وهمية غير فعّالة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.