
أدوات إثبات مفهوم لإعادة إنتاج ثغرة اجتياز المسار في Apache Camel camel-google-storage (CVE-2026-66907)، توضح الكتابة التعسفية للملفات عبر downloadFileName، مع تفاصيل الإصدارات المتأثرة والمصححة.
downloadFileName الخاص بـ camel-google-storageمستنسخات قابلة للتشغيل لإثبات المفهوم لنفس ثغرة Apache Camel، واحدة لكل بيئة تشغيل:
كلاهما نسختان متأثرتان (تم إصلاح المشكلة في 4.14.9 / 4.18.4 / 4.22.0)، وكلاهما يُظهر الخلل ذاته: يقوم مستهلك camel-google-storage بتنزيل كائنات الحاوية (bucket) إلى نظام الملفات المحلي عندما يكون downloadFileName دليلاً، وبناء الوجهة المحلية بإلحاق اسم الكائن البعيد به (downloadFileName + "/${file:name}"). يُرجع رمز ${file:name} اسم الكائن حرفيًا (على عكس ${file:onlyname} الذي يزيل المسار)، وتُمرَّر النتيجة إلى new File(result) / blob.downloadTo(file.toPath()) دون أي تطبيع ودون أي تحقق من بقاء الوجهة داخل الدليل المُعرَّف. اسم الكائن ليس مُتحكمًا فيه عبر المسار (route) — إذ يقوم المستهلك بسرد الحاوية وتنزيل كل كائن — لذا فإن أي كائن يحتوي اسمه على مقاطع ../ يُكتب خارج downloadFileName (CWE-22، تجاوز المسار → كتابة ملف تعسفية).
كل دليل فرعي مكتفٍ ذاتيًا (يحتوي على Dockerfile خاص به، وdocker-compose.yml لتشغيل محاكي fake-gcs-server، و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-66907.txt: true
content: PWNED via path traversal — CVE-2026-66907
>>> PROVEN: the object name's ../ segments escaped the configured downloadFileName directory ... : true
نشرة الأمان: https://camel.apache.org/security/CVE-2026-66907.html
يقوم المستهلك الآن بتطبيع المسار الذي تم حله ويؤكد أنه يبقى داخل دليل downloadFileName المُعرَّف (عبر GoogleCloudStorageFileNameHelper.assertWithinDirectory)، رافضًا أسماء الكائنات التي قد تخرج عنه.
يقوم ملف docker-compose.yml بتشغيل fake-gcs-server مع -backend memory. يتم بعد ذلك الاحتفاظ بأسماء الكائنات كمفاتيح خريطة غير شفافة، لذا يتم الحفاظ على الاسم الذي يحتوي على ../؛ أما الواجهة الخلفية الافتراضية لنظام الملفات فستقوم بحل ../ ولن يصبح الكائن قابلًا للسرد.
تم نشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة، والتحقق مما إذا كانوا متأثرين، والتأكد من أن الترقية تحلها. الملف المكتوب هو علامة غير ضارة تحت /tmp. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.
| بيئة التشغيل | الدليل | المكدس |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-google-storage 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (يضم Camel 4.20.0) |
| الخاصية | القيمة |
|---|
| المكوّن | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (تقييد غير سليم لاسم المسار إلى دليل مقيد — تجاوز المسار) |
| متجه الهجوم | كائن حاوية يحتوي اسمه على مقاطع ../، يتم تنزيله بواسطة المستهلك مع تعيين downloadFileName كدليل |
| التأثير | كتابة ملفات تعسفية خارج دليل التنزيل المُعرَّف |
| النسخ المتأثرة | من 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-24279 |
| الإشادة | n0mi1k |