تحميل ملف عشوائي مُصادَق عليه يؤدي إلى تنفيذ تعليمات برمجية عن بُعد — تحليل تقني وإعادة إنتاج مُتحكَّم بها لـ CVE-2026-38526 في Webkul Krayin CRM 2.2.x.
رفع ملفات تعسفي بعد المصادقة يؤدي إلى تنفيذ تعليمات برمجية عن بُعد — تحليل تقني وإعادة إنتاج مُتحكَّم بها لثغرة CVE-2026-38526 في Webkul Krayin CRM 2.2.x.
CVE-2026-38526 هي ثغرة رفع ملفات تعسفي بعد المصادقة تؤثر على Webkul Krayin CRM 2.2.x.
تُتاح الوظيفة المصابة عبر نقطة نهاية الرفع الخاصة بـ TinyMCE في التطبيق:
POST /admin/tinymce/upload
لا يقيّد التطبيق نوع الملف الذي يمكن رفعه بشكل كافٍ. يمكن لمستخدم مُصادَق عليه إرسال ملف بامتداد قابل للتنفيذ على جانب الخادم، مثل .php. يخزّن التطبيق الملف المرفوع ويعيد عنوان URL الخاص به القابل للوصول.
عندما يسمح النشر بتنفيذ PHP من موقع الرفع، يمكن لاحقًا طلب الملف المرفوع عبر خادم الويب، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد في سياق عملية تطبيق الويب.
يصنّف سجل CVE المنشور الثغرة بتقييم CVSS 3.1: 9.9 (حرجة).
يحتوي هذا المستودع على تحليلي التقني الخاص وإعادة إنتاجي المُتحكَّم بها للثغرة.
كانت الثغرة قد أُفصح عنها علنًا بالفعل تحت CVE-2026-38526. لا يدّعي هذا العمل اكتشاف الثغرة. كان الغرض من هذا البحث هو فهم التنفيذ المصاب، وإعادة إنتاج مسار الاستغلال في بيئة مُتحكَّم بها، وفحص الظروف التي تحوّل مشكلة رفع الملفات إلى تنفيذ تعليمات برمجية عن بُعد.
استُخدمت الثغرة أيضًا في جهاز Hack The Box GCSB 2026 Nexus، مما وفّر بيئة عملية لدراسة المشكلة.
المنتج: Webkul Krayin CRM الإصدارات المتأثرة: 2.2.x الثغرة: رفع ملفات تعسفي الأثر الناتج: تنفيذ تعليمات برمجية عن بُعد المصادقة: مطلوبة متجه الهجوم: الشبكة CWE: CWE-434 — الرفع غير المقيّد لملف من نوع خطير CVSS: 9.9 حرجة CVE: CVE-2026-38526
تتولى الوظيفة المصابة ما يلي:
/admin/tinymce/upload
تقبل نقطة النهاية ملفًا مرفوعًا عبر المعامل file. يستخرج منطق التطبيق ذو الصلة اسم الملف المخزَّن من اسم الملف الأصلي ويحتفظ بامتداده الأصلي.

هذا السلوك مهم لأن التطبيق لا يكتفي بقبول كائن مرفوع؛ بل يحتفظ بامتداد قابل للتنفيذ يتحكم به المهاجم ويجعل الكائن الناتج قابلًا للوصول عبر آلية تخزين التطبيق.
المشكلة الأساسية هي عدم كفاية التحقق من جانب الخادم على الملفات المرفوعة.
يستخدم التطبيق الامتداد الأصلي الذي يوفره العميل عند إنشاء اسم الملف المخزَّن. لا توجد قائمة سماح مقيّدة بما يكفي تمنع أنواع الملفات القابلة للتنفيذ من الوصول إلى طبقة التخزين.
التدفق ذو الصلة هو

لا يعالج استخدام اسم ملف مُولَّد المشكلة الأساسية.
على سبيل المثال، تحويل shell.php إلى اسم ملف مُولَّد مثل .php لا يجعل الملف المرفوع آمنًا إذا استمر الخادم في تفسير ملفات .php كتعليمات PHP برمجية قابلة للتنفيذ.
لا يعني الرفع غير المقيّد تلقائيًا تنفيذ تعليمات برمجية عن بُعد.
يعتمد مسار التنفيذ على تعامل الخادم مع الملف المرفوع.
في سيناريو النشر المصاب، تصبح السلسلة

إذا كان تنفيذ PHP معطّلًا لدليل الرفع، يمكن منع مسار RCE المباشر رغم بقاء ضعف رفع الملفات التعسفي الأساسي.
wget:
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
wget https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
curl:
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/upload.py
curl -LO https://raw.githubusercontent.com/Ish3ng0m4/CVE-2026-38526-KrayinCRM/main/poc/marker.php
2. ضع الملفات في
poc/
├── upload.py
└── marker.php
3. أنشئ بيئة Python وثبّت الاعتمادية
python3 -m venv .venv
source .venv/bin/activate
pip install requests
4. اجعل PoC قابلاً للتنفيذ
chmod +x poc/upload.py
6. شغّله
python3 poc/upload.py \
--url http://[Lab_IP:PORT] \
--email [email protected] \
--password 'YOUR_PASSWORD'
يتطلب الاستغلال حسابًا مصادقًا عليه قادرًا على الوصول إلى الوظيفة المعرضة للخطر.
على مستوى عالٍ:
يُحدَّد سياق التنفيذ الناتج حسب النشر الأساسي. في نشر Linux نموذجي قد يكون هذا حساب خدمة خادم الويب، مثل:
www-data
هذا لا يوفر تلقائيًا امتيازات الجذر على نظام التشغيل. يعتمد التأثير الإضافي على الأذونات وتكوين البيئة المخترقة.
يمكن اختزال السلوك المعرض للخطر إلى ثلاث عمليات مهمة.
الحصول على الملف المرفوع
$file = request()->file('file');
يستقبل التطبيق الملف المقدم من العميل.
الحفاظ على الامتداد الذي يتحكم فيه العميل
$filename = md5($file->getClientOriginalName().time())
.'.'.$file->getClientOriginalExtension();
يُغيَّر اسم الملف نفسه، لكن يُحتفظ بالامتداد الأصلي. هذا تمييز مهم: عشوائية اسم الملف ليست تحققًا من نوع الملف.
تخزين الملف وكشفه
$path = $file->storeAs($this->storagePath, $filename);
return [
'file' => $path,
'file_name' => $file->getClientOriginalName(),
'file_url' => Storage::url($path),
];
يخزّن التطبيق الملف ويوفر عنوان URL الخاص به للعميل.
قد يوفر الاستغلال الناجح للمهاجم تنفيذ شيفرة بامتيازات تطبيق الويب.
اعتمادًا على النشر، قد يسمح هذا للمهاجم بـ:
قراءة ملفات التطبيق
الوصول إلى تكوين التطبيق
الحصول على بيانات اعتماد قاعدة البيانات أو أسرار أخرى
تعديل بيانات التطبيق
نشر شيفرة خبيثة إضافية
التحرك نحو أنظمة أخرى يمكن الوصول إليها من المضيف المخترق
محاولة تصعيد الامتيازات بشكل أكبر
يعتمد التأثير الفعلي على امتيازات عملية التطبيق المخترقة وتكوين الأمان للنظام الأساسي.
يجب أن يستخدم التنفيذ الآمن طبقات حماية متعددة بدلاً من الاعتماد على فحص امتداد واحد.
ينبغي قبول أنواع الملفات المطلوبة صراحةً فقط. على سبيل المثال:
.jpg
.jpeg
.png
.gif
.webp
يجب أن تعكس القائمة المسموح بها الدقيقة المتطلبات المشروعة للتطبيق.
لا تعتمد فقط على:
ينبغي أن تحصل الملفات المرفوعة على أسماء تُولّدها الخادم، ويجب ألا تحتفظ بامتدادات قابلة للتنفيذ يتحكم بها المهاجم.
ينبغي تعطيل PHP وغيرها من المفسّرات من جانب الخادم في المجلدات المخصصة للمحتوى الذي يرفعه المستخدمون. يوفر هذا حدًا أمنيًا إضافيًا حتى في حال تجاوز إحدى ضوابط التحقق من الرفع.
حيثما كان ذلك عمليًا، ينبغي تخزين المحتوى المرفوع خارج جذر الويب القابل للتنفيذ وتقديمه عبر آلية خاضعة للتحكم.
ينبغي ألا يكون لنقطة النهاية (endpoint) وصولٌ إلا للمستخدمين المصادَق عليهم والأدوار التي تحتاج فعليًا إلى وظيفة الرفع.
تم الإفصاح عن CVE-2026-38526 علنًا قبل هذا البحث.
يمثل هذا المستودع تحليلي التقني المستقل وإعادة الإنتاج الخاضعة للتحكم للثغرة. ولا يدّعي الاكتشاف الأصلي أو إسناد CVE.
الباحث: Gabriel D. Ishengoma
مجال التركيز: أبحاث الثغرات / الأمن الهجومي