
أكواد إثبات المفهوم (PoC) لإعادة إنتاج ثغرة اجتياز المسار (CVE-2026-66906) في Apache Camel بمكوّن camel-azure-storage-blob، توضح الكتابة التعسفية للملفات عبر اجتياز اسم blob، مع تفاصيل الإصدارات المتأثرة والإصدارات المصححة.
downloadBlobToFileأدوات إثبات مفهوم (PoC) قابلة للتشغيل تُعيد إنتاج نفس ثغرة Apache Camel، واحدة لكل بيئة تشغيل:
كلا الإصدارين متأثران (تم إصلاح المشكلة في 4.14.9 / 4.18.4 / 4.22.0)، وكلاهما يوضّح العيب نفسه: مستهلك camel-azure-storage-blob يُنزّل blobs الحاوية إلى نظام الملفات المحلي داخل الدليل الذي يحدده خيار fileDir، بإنشاء الهدف المحلي كالتالي new File(fileDir, client.getBlobName()) — أي اسم blob البعيد بالضبط كما أبلغ عنه Azure SDK، مع عدم إجراء أي تطبيع وعدم إجراء أي تحقق من أن الموقع الناتج يبقى داخل fileDir. اسم blob ليس مُتحكَّمًا فيه عبر الراوت (route): إذ يسرد المستهلك الحاوية (BlobConsumer.createBatchExchangesFromContainer) ويُنزّل كل blob. وبالتالي فإن أي blob يحتوي اسمه على مقاطع ../ يُكتب خارج fileDir (CWE-22، اجتياز المسار → كتابة ملف تعسفية).
كل دليل فرعي مكتفٍ بذاته (يحتوي على Dockerfile خاص به، وdocker-compose.yml يشغّل محاكي Azurite، وREADME). باختصار، لأيٍّ منهما:
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
المخرجات المتوقعة على النسخة المتأثرة (في كلا النسختين):
Files inside the intended download directory /app/downloads:
- report.txt
File written OUTSIDE it, at /tmp/pwned-66906.txt: true
content: PWNED via path traversal — CVE-2026-66906
>>> PROVEN: the blob name's ../ segments escaped the configured fileDir directory ... : true
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-66906.html
أصبح المستهلك الآن يحلّ ويقيّد هدف التنزيل داخل دليل fileDir المُعدّ (عبر AzureFileNameHelper.resolveWithinDirectory)، رافضًا أسماء blobs التي قد تخرج عنه. يغطي الإصلاح نفسه المكوّنات الشقيقة camel-azure-storage-datalake (CVE-2026-60093).
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين بها، والتأكد من أن الترقية تؤدي إلى حلّها. الملف المكتوب هو علامة غير ضارة في /tmp. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو تديرها.
| بيئة التشغيل | الدليل | المكدس |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-blob 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (يضمّ Camel 4.20.0) |
| الخاصية | القيمة |
|---|
| المكوّن | camel-azure-storage-blob (Spring Boot: camel-azure-storage-blob-starter; Quarkus: camel-quarkus-azure-storage-blob) |
| CWE | CWE-22 (تقييد غير سليم لاسم مسار إلى دليل مقيد — اجتياز المسار) |
| ناقل الهجوم | blob حاوية يحتوي اسمه على مقاطع ../، يتم تنزيله بواسطة المستهلك مع تعيين 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 |