
نموذج إثبات مفهوم قابل للتشغيل بـ Spring Boot يعيد إنتاج CVE-2026-85317، حيث تتجاهل ذاكرة التخزين المؤقت لرموز OAuth2 في camel-http النطاق والموارد ونقطة نهاية الرمز، إضافةً إلى نسخة تحكم مُصحّحة.
مُعيد إنتاج عملي قابل للتشغيل لثغرة Apache Camel حيث كانت ذاكرة التخزين المؤقت لرموز عميل OAuth2 في camel-http
— وهي خريطة static على مستوى الـ JVM بأكملها — تُفهرس مدخلاتها على (uri, clientId, clientSecret) فقط، مع إغفال الحقول التي
تُشكّل الرمز فعليًا: النطاق المطلوب، ومؤشر المورد، ونقطة نهاية الرمز. لذلك، فإن نقطتي نهاية تختلفان في تلك الحقول فقط
كانتا تتشاركان مدخل ذاكرة تخزين مؤقت واحد، فيمكن أن يُقدَّم لنقطة نهاية رمز صادر
لـ نطاق مختلف، أو مورد مختلف، أو من خادم تفويض مختلف — أي طلب يحمل
صلاحية أوسع مما ضُبطت عليه نقطة النهاية، أو رمز يُقدَّم لطرف لم يُصدر له
(CWE-524).
Spring Boot فقط. يشحن مُعيد الإنتاج هذا وحدة Camel Spring Boot واحدة. العيب موجود في عميل OAuth2 الخاص بـ
camel-http، والذي يمتلك أيضًا امتدادcamel-quarkus-http؛ لكن في حزمة JVM الخاصة بذلك الامتداد لا تُطبَّق خيارات العميلoauth2*على مستوى نقطة النهاية بالطريقة نفسها التي تُطبَّق بها تحت Spring Boot (إذ لا يُوصَّل اعتراض طلبات OAuth2 الذي يملك ذاكرة التخزين المؤقت للرموز أبدًا، فلا تُستدعى نقطة نهاية الرمز قط) — وهو القيد نفسه الموثّق لـ CVE-2026-85251. تُظهر وحدة Spring Boot السلوك المتأثر والمُصلَح.
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
يحاكي برنامج التشغيل اختبار الانحدار الخاص بالإصلاح نفسه (HttpOAuth2TokenCachingTest). يعمل خادمان HTTP مؤقتان داخل
العملية: نقطة نهاية رمز تُصدر رمز حامل (bearer token)، وهدف يتطلبه. يقوم المدقّق
(/exploit/attack) بما يلي:
oauth2CacheTokens=true&oauth2Scope=read — فيُصدر رمز ويُخزَّن مؤقتًا؛oauth2Scope=read+write.read —
فينجح رغم اختفاء نقطة نهاية الرمز (إذ لا يمكن إصدار رمز جديد على الإطلاق).HttpHostConnectException).cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: 2nd request 200 (reused read token); >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85317-http-oauth2-token-cache-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 2nd request HttpHostConnectException; >>> Not exploited
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-http (OAuth2ClientConfigurer، ذاكرة التخزين المؤقت للرموز) |
| CWE | CWE-524 (استخدام ذاكرة تخزين مؤقت تحتوي على معلومات حساسة) |
| الخطورة | MEDIUM |
| ناقل الهجوم | يقوم النشر بتكوين أكثر من نقطة نهاية OAuth2 واحدة تختلف فقط في النطاق أو مؤشر المورد أو نقطة نهاية الرمز؛ وتتشارك جميعها ذاكرة التخزين المؤقت للرموز على مستوى JVM بالكامل |
| التأثير | يتم تقديم رمز صادر لنطاق/مورد/خادم تفويض مختلف إلى نقطة نهاية — سلطة أوسع من المكوّنة، أو رمز يُقدَّم إلى طرف خاطئ |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24456 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85317.html
يمدّد OAuth2ClientConfigurer سجل مفتاح ذاكرة التخزين المؤقت
OAuth2URIAndCredentials ليشمل نقطة نهاية الرمز والنطاق ومؤشر المورد، بحيث لا تعود الإدخالات مشتركة
بين نقاط النهاية التي تختلف في أي من تلك الحقول.
شغّل نقاط النهاية التي تختلف في النطاق أو مؤشر المورد أو نقطة نهاية الرمز في JVMs منفصلة حتى لا تتشارك ذاكرة التخزين المؤقت الثابتة.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. الرمز
(xxx.yyy.zzz) ومعرّف العميل والسرّ هي قيم نائبة غير ضارة، ويعمل كلا خادمي HTTP داخل العملية نفسها. لا تستخدم هذه
المواد ضد أنظمة لا تملكها أو لا تديرها.