
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-79984، وهو اجتياز مسار في Apache Camel camel-mina-sftp، مع تجهيزات خادم SFTP خبيثة ونسخ بناء متأثرة مقابل مُصلحة.
مُعيد إنتاج إثبات مفهوم قابل للتشغيل لثغرة Apache Camel حيث يقوم مستهلك mina-sftp — الذي
يشتق من نفس الفئة الأساسية RemoteFileConsumer مثل مستهلكي الملفات البعيدة الآخرين — ببناء المسار
البعيد المطلق لكل ملف يتم استطلاعه عبر دمج الدليل المُهيأ مع الاسم المُبلَّغ عنه في قائمة دليل الخادم،
دون تطبيع معجمي ودون فحص احتواء. يصبح ذلك المسار بعد ذلك معاملًا للاسترجاع (دائمًا)، وللحذف أو إعادة
التسمية عند تهيئة delete=true أو move أو preMove أو moveFailed أو readLock=rename.
اسم إدخال دليل SFTP هو سلسلة بروتوكول خام يوفّرها الخادم، لذا يمكن لخادم مخترق أو خبيث أو متعدد المستأجرين أن يُبلّغ عن اسم ليس مقطع مسار واحد.
هذا هو الشقيق
mina-sftpلـ CVE-2026-79983 (camel-ftp)؛ وكلاهما يتشاركان نفس السبب الجذري ونفس الإصلاح.
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0، متأثر؛ ضابط مُصلَح 3.40.0 / Camel 4.22.1) |
أُدخل
camel-mina-sftpفي Camel 4.18.0، لذا لا يوجد المكوّن في Camel 4.15.0 المضمّن في أحدث إصدار مرقّم من Camel Quarkus؛ يستخدم مُعيد الإنتاج هذا Camel Quarkus 3.39.0 (Camel 4.22.0، متأثر)، مع 3.40.0 (Camel 4.22.1) كضابط مُرقَّع. لذلك تُظهر كلتا الوحدتين السلوك المتأثر و السلوك المُصلَح.
يضمّن التطبيق خادم SFTP خبيثًا عن قصد (Apache MINA SSHD). يخدم شجرة دليل مؤقتة حقيقية
لكنه يعيد كتابة، في ردّه SSH_FXP_READDIR، اسم ملف واحد في الدليل المستطلع /upload إلى
سلسلة التجاوز d/../../outside.txt (عبر تجاوز getShortName). لا يبدأ الاسم بنقطة، لذا
لا تلتقطه قاعدة الملفات المخفية في Camel، و/upload + d/../../outside.txt يُحلّ إلى /outside.txt، على
مستوى واحد فوق الدليل المستطلع. يستطلع مستهلك mina-sftp عادي الدليل /upload.
normal.txt و/outside.txt الهارب.normal.txt ويتخطى الإدخال الهارب، مسجّلًا
Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
name=[normal.txt] (inside)
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-mina-sftp (مخطط mina-sftp) |
| CWE | CWE-22 (التقييد غير السليم لاسم المسار إلى دليل محظور) |
| الخطورة | عالية |
| ناقل الهجوم | اسم إدخال READDIR (يوفّره الخادم) ليس مقطع مسار واحدًا |
| التأثير | قراءة — ومع delete/move/readLock=rename، حذف أو إعادة تسمية — ملفات خارج الدليل المُستقصى، باستخدام بيانات اعتماد نقطة النهاية |
| الإصدارات المتأثرة | من 4.18.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24487 |
| الفضل | Dilrevx من NSSL، SJTU |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-79984.html
تقوم الدالة GenericFileConsumer.isWithinStartingDirectory (التي تتجاوزها RemoteFileConsumer، التي يشتق منها مستهلك mina-sftp) بضغط المسار المُحلَّل والتحقق، على حدود مقاطع المسار، من أنه يبقى داخل الدليل المُستقصى؛ ويُتخطّى أي إدخال يُحلّ إلى الخارج مع تسجيل تحذير بينما تُعالَج الإدخالات المشروعة رغم ذلك.
تحقّق من مفتاح مضيف الخادم، وقيّد المستهلك باستخدام filter/antInclude/include لقبول الأسماء ذات المقطع الواحد فقط، وتجنّب delete/move/preMove/moveFailed/readLock=rename مع الخوادم التي لا تكون قوائم محتوياتها موثوقة بالكامل. وحيثما أمكن، احصر حساب الخادم في الدليل المُستقصى.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. الخادم الخبيث و«السر» هما عناصر محلية خاملة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.