
نموذج إثبات مفهوم قابل للتشغيل بـ Spring Boot يعيد إنتاج CVE-2026-85313، حيث يعكس Apache Camel camel-jetty enableCORS أي أصل (origin) مع بيانات الاعتماد، إضافةً إلى نسخة تحكم بإصدار مُصحَّح.
enableCORS وصولاً من أي أصل مع بيانات الاعتمادمُعيد إنتاج قابل للتشغيل لإثبات المفهوم لثغرة Apache Camel حيث أدى تعيين enableCORS=true على نقطة نهاية Jetty
إلى تثبيت CrossOriginFilter الخاص بـ Jetty بإعداداته الافتراضية الجاهزة — والتي تعكس كل أصل و
تسمح ببيانات الاعتماد. فالمشغّل الذي طلب CORS فحسب حصل على سياسة تتيح لصفحة من أي أصل إجراء
طلبات عابرة للأصول مع بيانات الاعتماد إلى نقطة النهاية وقراءة الاستجابات. إن عكس الأصل إلى جانب
Access-Control-Allow-Credentials: true هو بالضبط إعداد أي أصل مع بيانات الاعتماد الذي يرفض معيار Fetch
أن يعبّر عنه * — إذ يُعدّ العكس هو الطريقة المعتادة للالتفاف على تلك القاعدة (CWE-942).
Spring Boot فقط. تشحن هذه الأداة وحدة Camel Spring Boot واحدة. يكمن العيب في
camel-jetty، التي تُضمّن خادم Jetty HTTP. لا يملك Camel Quarkus امتدادcamel-quarkus-jetty— إذ يقدّم Quarkus HTTP عبر Vert.x (platform-http) — لذا لا يوجد نظير في Quarkus لإعادة إنتاجه. (يغطي التنبيه المرافق CVE-2026-85316 فئة العيب نفسها فيplatform-http-vertx.) توضّح وحدة Spring Boot السلوك المتأثر والمُصلَح.
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-jetty 4.22.0 (متأثرة؛ مُصلَحة 4.22.1)، Jetty 12.1.11 |
يعمل خادما Jetty في عملية واحدة: نقطة النهاية المعرّضة للثغرة /protected (المنفذ 8081) مُعلنة بـ
enableCORS=true، ونقطة نهاية التحقق /exploit/attack (المنفذ 8080) تؤدي دور متصفح المهاجم. في كل استدعاء
يرسل المُتحقِّق طلب GET عابراً للأصول إلى /protected حاملاً Origin: https://evil.example — وهو أصل لم
يُصرّح به النشر قط — ويُبلّغ عن ترويسات CORS التي تعود.
Access-Control-Allow-Origin: https://evil.example و تُرجع
Access-Control-Allow-Credentials: true — أي أصل يمكنه قراءة الاستجابات الحاملة لبيانات الاعتماد.Access-Control-Allow-Credentials لأصل لم يسمّه المشغّل.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: ACAO reflected + ACAC: true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85313-jetty-cors-credentials-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: ACAO reflected, ACAC absent; >>> Not exploited
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-jetty (JettyHttpComponent، enableCORS) |
| CWE | CWE-942 (سياسة نطاقات متقاطعة متساهلة مع نطاقات غير موثوقة) |
| الخطورة | متوسطة |
| ناقل الهجوم | تُصدر صفحة من أي أصل طلبًا متقاطع الأصول مع بيانات اعتماد إلى نقطة نهاية مُهيّأة فقط بـ enableCORS=true |
| التأثير | تعكس نقطة النهاية أصل المهاجم وتمنح بيانات الاعتماد، لذا يمكن لصفحة المهاجم قراءة الاستجابات الموثّقة |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24450 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85313.html
أصبح JettyHttpComponent يطبّق إعداداته الافتراضية الخاصة بـ CORS عند تعيين enableCORS: إذ يصبح allowCredentials افتراضيًا false ما لم يُهيّئه المشغّل صراحةً. ويبقى انعكاس الأصل دون تغيير، لذا يستمر تفعيل CORS في العمل مع الطلبات التي لا تحمل بيانات اعتماد؛ أما المشغّل الذي يحتاج إلى طلبات متقاطعة الأصول مع بيانات اعتماد فيعيّن filterInit.allowCredentials=true ويُتوقع منه تسمية الأصول في filterInit.allowedOrigins (ويُنبَّه إن لم يفعل).
هيّئ معاملات CrossOriginFilter صراحةً بدلًا من الاعتماد على ما يثبّته enableCORS — سمِّ الأصول المسموح بها في filterInit.allowedOrigins واترك filterInit.allowCredentials معطّلًا ما لم تكن قد سمّيتها.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. أصل "المهاجم" هو عنصر نائب غير ضار (https://evil.example) وكلٌّ من نقطة النهاية والفحص يعملان داخل أداة إعادة الإنتاج. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.