الانتقال إلى المحتوى
الدعم الفني والتذاكر

تقرير خلل لم يتكرر تمامًا، ولماذا أصلحناه مع ذلك

أبلغ باحث أمني عن مسار XSS مخزَّن عبر مرفقات PDF في تذاكر FanDesk. المسار الدقيق لم يتكرر على الأرجح كما وُصف، ومع ذلك عزّزنا حماية الشيفرة.

H
Hamze Zare Nasiri
16 سبتمبر 2026
تقرير خلل لم يتكرر تمامًا، ولماذا أصلحناه مع ذلك

راسلنا باحث أمني اسمه Dhruv ليبلغ عن مسار XSS مخزَّن: يرفق شخص ما ملف PDF يحتوي على JavaScript مضمَّن في تذكرة دعم على FanDesk، وعندما يفتحه موظف الدعم يُنفَّذ السكربت «في سياق التطبيق».

ما وجدناه عند الفحص

مسار التنزيل في FanDesk يفرض Content-Disposition: attachment وapplication/octet-stream منذ ديسمبر 2025، وتحققنا من ذلك عبر git blame. عارض المرفقات في الواجهة الأمامية لا يحتوي على أي iframe أو embed أو object في أي مكان من الشيفرة؛ كل مرفق ليس صورة يمر عبر تنزيل Blob، ولا يُعرض مضمَّنًا في الصفحة أبدًا. والملفات المرفوعة يجري التحقق منها أصلًا بمكتبة python-magic، التي تقرأ البايتات الحقيقية للملف بدل الوثوق بنوع المحتوى الذي يدّعيه المتصفح، ونوع image/svg+xml مستبعد صراحةً من قائمة السماح لهذا السبب تحديدًا، فملف SVG قد يحمل وسم <script>.

إذن المسار الذي وصفه Dhruv بالضبط لا يتكرر على الأرجح كما كُتب. لكن هذا ليس سببًا لترك الشيفرة على حالها.

ما غيّرناه على أي حال

التحقق وقت الرفع يخبرك فقط بما كان عليه الملف عندما رفعه أحدهم. لا شيء يمنع أن تُقدَّم البايتات المخزنة بطريقة مختلفة لاحقًا إذا تغيّر مسار آخر في الشيفرة. سددنا هذه الفجوة بإعادة اكتشاف نوع MIME الحقيقي وقت التنزيل أيضًا، من البايتات نفسها على القرص، لا من النوع المخزَّن في قاعدة البيانات:

detected_type = magic.from_file(str(file_path), mime=True)
is_image = FileStorageService.renders_inline_safely(detected_type)

لا يُقدَّم بصيغة inline إلا نوع صورة موجود في قائمة السماح؛ أما كل ملف PDF، وكل ما لا نتعرف عليه صراحةً، فيُفرض تنزيله، ومعه الآن X-Content-Type-Options: nosniff وContent-Security-Policy: default-src 'none'; sandbox في الاستجابة، فلا يستطيع المتصفح أن يقرر غير ذلك حتى لو فتح مسار مستقبلي في الشيفرة الملف مباشرة. أضفنا أربعة اختبارات حول هذا المنطق ونشرناه على بيئة الإنتاج في اليوم نفسه.

الدرس الحقيقي

تقرير الخلل الذي لا يتكرر تمامًا كما كُتب يستحق مع ذلك قراءة متأنية. رسالة Dhruv أشارت إلى فجوة حقيقية، ليست قابلة للاستغلال اليوم، لكنها فجوة بين ما نتحقق منه عند الرفع وما نثق به عند التنزيل. سدّ تلك الفجوة كلّف فترة بعد الظهر. واكتشاف أننا نحتاج إلى سدّها كلّف انتباه شخص آخر ودقته، واستحق ردًا نشكره فيه على ذلك.

أصبحت ملفات PDF أيضاً الحامل الرئيسي لتصيّد رموز QR؛ اطّلع على ما وجده تقرير مايكروسوفت للدفاع الرقمي 2026 عن رموز QR داخل ملفات PDF.

ثغرات مكاتب الدعم ليست خطرًا نظريًا. في سبتمبر 2026 أوصلت ثغرتان غير معروفتين في Zammad مهاجمًا من مكتب الدعم العام لدى DIVD إلى root؛ كتبنا عن ما حدث وقائمة فحص لأنظمة التذاكر المستضافة ذاتيًا.

تحتاج نظام دعم فني يأخذ الأمان بجدية؟

FanDesk نظام مكتب دعم للمؤسسات بواجهة كاملة من اليمين إلى اليسار، واتفاقيات مستوى خدمة حسب ساعات العمل، وخيار الاستضافة الذاتية، يبنيه ويعزّز حمايته الفريق نفسه الذي يشغّله في بيئة الإنتاج.

عرض FanDesk

شارك هذا المقال