
CVE-2026-27621 - يحتوي TypiCMS Core على برمجة نصية مخزنة عبر المواقع (XSS) عبر رفع ملفات SVG
| الحقل | التفاصيل |
|---|
| معرف CVE | CVE-2026-27621 |
| الخطورة | متوسطة |
| النشرة الأمنية | عرض النشرة |
| اكتشفها | Lukasz Rybak |
توجد ثغرة تخزين البرمجة النصية عبر المواقع (Stored XSS) في وحدة رفع الملفات في TypiCMS. يسمح التطبيق للمستخدمين الذين لديهم صلاحيات رفع الملفات برفع ملفات SVG. وعلى الرغم من وجود تحقق من نوع MIME، إلا أن محتوى ملف SVG لا يتم تنظيفه. يمكن للمهاجم رفع ملف SVG مُعدّ خصيصًا يحتوي على كود JavaScript خبيث. عندما يقوم مستخدم آخر (مثل مسؤول) بعرض هذا الملف أو الوصول إليه عبر التطبيق، يتم تنفيذ السكربت في متصفحه، مما يؤدي إلى اختراق جلسة ذلك المستخدم.
وتتفاقم المشكلة بسبب خطأ في منطق تحليل SVG، والذي يمكن أن يسبب خطأ 500 إذا كان ملف SVG المرفوع لا يحتوي على خاصية viewBox. ومع ذلك، فإن هذا لا يخفف من ثغرة XSS، إذ يمكن للمهاجم بسهولة تضمين خاصية viewBox صالحة في حمولته الخبيثة.
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php و TypiCMS\Modules\Core\Services\FileUploader.php.تنبع الثغرة من نقطتين رئيسيتين:
FileFormRequest بإدراج svg صراحةً في القائمة البيضاء لأنواع MIME المسموح بها للرفع.FileUploader بحفظ ملف SVG على الخادم دون تحليل محتواه وتنظيفه لإزالة العناصر التي يحتمل أن تكون خطيرة مثل وسوم <script> أو معالجات الأحداث on*.عند ضبط قرص نظام الملفات الافتراضي على public، يتم تخزين ملف SVG المرفوع في دليل متاح للعموم، مما يجعل الوصول إلى الملف عبر رابط مباشر وتشغيل حمولة XSS أمرًا تافهًا.
إنشاء ملف SVG خبيث:
أنشئ ملفًا باسم malicious.svg بالمحتوى التالي. تم تضمين خاصية viewBox لتجاوز خطأ التحليل في التطبيق.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// A simple PoC to demonstrate the vulnerability
alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
</script>
<text x="10" y="50">If you see this, the script has run.</text>
</svg>
رفع الملف الخبيث:
/admin/files).malicious.svg. سيقبل التطبيق الملف ويخزنه.
http://<your-site>/storage/files/malicious.svg.الاستغلال الناجح لهذه الثغرة يسمح للمهاجم بتنفيذ JavaScript عشوائي في سياق متصفح الضحية. وعلى الرغم من أن استخدام علامة HttpOnly على ملفات تعريف الارتباط الخاصة بالجلسة يمنع السرقة المباشرة لمعرف الجلسة عبر document.cookie، إلا أن المهاجم لا يزال قادرًا على تحقيق اختراق كامل لحساب الضحية من خلال تنفيذ إجراءات نيابةً عنه.
يشمل الأثر:
الاستيلاء على الحساب عبر تزوير الإجراءات: يمكن لسكربت المهاجم إرسال طلبات مصادقة إلى واجهة برمجة التطبيقات (API) الخاصة بالتطبيق من متصفح الضحية. وهذا يسمح للمهاجم بتنفيذ أي إجراء مفوض للضحية، مثل:
كشف المعلومات الحساسة: يمكن للسكربت قراءة محتوى أي صفحة تعرضها الضحية داخل لوحة التحكم. ويشمل ذلك قوائم المستخدمين (مع الأسماء وعناوين البريد الإلكتروني)، وإعدادات التطبيق الخاصة، وغيرها من البيانات الحساسة، التي يمكن بعد ذلك إرسالها إلى خادم يتحكم فيه المهاجم.
التصيد والهندسة الاجتماعية: يمكن للسكربت التلاعب بواجهة لوحة التحكم لعرض نماذج تسجيل دخول مزيفة لخداع المستخدم لإعادة إدخال بيانات اعتماده، أو إعادة توجيهه إلى موقع ويب خبيث.
تسجيل ضغطات المفاتيح: يمكن للسكربت التقاط أي معلومات يكتبها الضحية في النماذج على الصفحة المخترقة.
نظرًا لأن المهاجم يمكنه تنفيذ أي إجراء بصفته مسؤولًا مصادقًا، فإن هذه الثغرة تؤدي فعليًا إلى اختراق كامل للتطبيق، حتى دون الوصول المباشر إلى ملف تعريف ارتباط الجلسة. الخطر مرتفع.
يوصى باتباع نهج الدفاع العميق للتخفيف من هذه الثغرة.
الإصلاح الأساسي: تنظيف محتوى SVG:
الحل الأكثر متانة هو تنظيف ملفات SVG عند الرفع. قبل حفظ الملف، يجب تحليله لإزالة جميع العناصر التي يحتمل أن تكون خطرة، بما في ذلك وسوم <script> و<style> و<foreignObject> وجميع سمات الأحداث on*. يمكن تحقيق ذلك باستخدام مكتبة مخصصة لتنظيف SVG.
الإصلاح الثانوي: تعطيل رفع SVG:
إذا لم تكن ميزة رفع SVG ميزة حاسمة للتطبيق، فإن الحل الأبسط والأكثر أمانًا هو تعطيلها تمامًا. يمكن القيام بذلك عن طريق إزالة 'svg' من قائمة أنواع MIME المسموح بها في TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php.
// In FileFormRequest.php
// BEFORE:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// AFTER:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // Removed 'svg'
التحصين - سياسة أمان المحتوى (CSP): قم بتنفيذ ترويسة سياسة أمان المحتوى (Content-Security-Policy) صارمة للتطبيق. يمكن لسياسة CSP مُعدّة جيدًا منع تنفيذ السكربتات المضمّنة، مما يخفف من أثر ثغرة XSS هذه.
التحصين - تقديم محتوى المستخدم من نطاق منفصل: قدّم جميع الملفات التي يرفعها المستخدمون من نطاق منفصل بدون ملفات تعريف ارتباط (cookie-less). هذا إجراء أمني فعال للغاية يعزل المحتوى الذي ينشئه المستخدم عن التطبيق الرئيسي، ويمنع السكربتات من الوصول إلى ملفات تعريف ارتباط الجلسة أو التفاعل مع DOM الخاص بالتطبيق.
تم الإبلاغ عن هذا CVE بشكل مسؤول وفقًا لممارسات الإفصاح المنسق عن الثغرات الأمنية. المعلومات الواردة هنا مخصصة للأغراض التعليمية والدفاعية فقط.