
أدوات إعادة إنتاج لإثبات المفهوم لثغرة اجتياز المسار في Apache Camel (CVE-2026-60093) في camel-azure-storage-datalake، والتي توضح كتابة ملفات عشوائية عبر downloadToFile.
downloadToFile في camel-azure-storage-datalakeنماذج إثبات مفهوم (PoC) قابلة للتشغيل تُعيد إنتاج نفس ثغرة Apache Camel، نموذج واحد لكل بيئة تشغيل:
كلا النموذجين متأثران (تم إصلاح المشكلة في 4.14.9 / 4.18.4 / 4.22.0)، ويُظهر كلاهما العيب ذاته تمامًا: يمكن لمكوّن camel-azure-storage-datalake تنزيل ملف ADLS Gen2 إلى نظام الملفات المحلي عبر عملية downloadToFile الخاصة به، والكتابة داخل الدليل المُحدَّد بخيار fileDir. كانت DataLakeFileOperations.downloadToFile تُنشئ الهدف المحلي بضم fileDir إلى اسم المسار البعيد تمامًا كما أبلغ عنه Azure SDK (new File(fileDir, fileClientWrapper.getFileName())) — دون أي تطبيع معجمي ودون أي تحقق من بقاء الموقع المُحلَّل داخل fileDir. لا يخضع الاسم البعيد للتحكم عبر المسار: يعدّ المستهلك نظام الملفات (DataLakeConsumer.createBatchExchangesFromPath) وينزّل كل مُدخل. لذلك فإن اسم المسار الذي يحتوي على مقاطع ../ يُحل خارج fileDir (CWE-22، تجاوز المسار → كتابة ملف تعسفية).
ملاحظة حول بيئة الاختبار. لا تنفّذ أي محاكٍ محلي متاح واجهة برمجة تطبيقات Azure Data Lake Gen2 — يُرجع Azurite HTTP 400 لعمليات Gen2
listPathsوعمليات الملفات. لذلك تقود هذه النماذج الكود القابل للاستغلال تمامًا (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())) مباشرةً، مع توفير غلاف عميل ملفات Data Lake تُرجع فيهgetFileName()الاسم البعيد — تمامًا كما يزوّد المستهلك بالاسم الذي قرأه منPathItem.getName(). يتشارك المكوّن الشقيقcamel-azure-storage-blobفي الإصلاح نفسه (CVE-2026-66906) وهناك يُعاد إنتاج العيب المتطابق من البداية إلى النهاية مقابل محاكي Azurite حيّ.
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
المخرجات المتوقعة على بناء متأثر (كلا النموذجين):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-60093.html
أصبح المستهلك الآن يُحلّل هدف التنزيل ويقيّده بدليل fileDir المُعد (عبر AzureFileNameHelper.resolveWithinDirectory)، رافضًا أسماء المسارات التي قد تخرج عنه — وهو نفس الإصلاح الذي يغطي camel-azure-storage-blob (CVE-2026-66906).
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، والتأكد من أن الترقية تحلّها. الملف المكتوب هو علامة حميدة تحت /tmp. لا تستخدم هذه المادة ضد أنظمة لا تملكها أو لا تشغّلها.
| بيئة التشغيل | الدليل | المكدس التقني |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (يضم Camel 4.20.0) |
| الخاصية | القيمة |
|---|
| المكوّن | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (تقييد غير سليم لاسم المسار داخل دليل مقيد — تجاوز المسار) |
| متجه الهجوم | ملف Gen2 يحتوي اسم مساره على مقاطع ../، ويتم تنزيله بواسطة المستهلك مع تعيين fileDir |
| الأثر | كتابة ملف تعسفية خارج دليل fileDir المُعد |
| الإصدارات المتأثرة | من 4.0.0 وحتى ما قبل 4.14.9، ومن 4.15.0 وحتى ما قبل 4.18.4، ومن 4.19.0 وحتى ما قبل 4.22.0 |
| الإصدارات المُصلحة | 4.14.9، 4.18.4، 4.22.0 |
| JIRA | CAMEL-23942 |
| الإسناد | n0mi1k; Hiep Nguyen |