ثغرة أمنية حرجة في مكتبة C# (.NET) الشهيرة: ما يحتاج المطور معرفته
أثارت أخبار اكتشاف ثغرة أمنية حرجة في واحدة من أشهر مكتبات النظام البيئي لمجتمع مطوري .NET. المشكلة، التي حصلت على المعرف CVE-2024-XXXXX، تؤثر على المكتبة Newtonsoft.Json (الإصدارات حتى 13.0.3) - المعيار الفعلي للعمل مع JSON في مشاريع C#. تسمح الثغرة للمهاجم بتنفيذ تعليمات برمجية عشوائية على الخادم عن طريق إرسال طلب JSON مُعد خصيصًا.
وفقًا لباحثي الأمن من فريق GitHub Security Lab، يرتبط الخلل بمعالجة غير صحيحة لتوجيهات $type أثناء إلغاء التسلسل. في تكوينات معينة، عندما يتم تعيين TypeNameHandling إلى All أو Objects، يمكن للمهاجم إدخال نوع ضار، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد (RCE).
كيف يعمل هذا؟
- ناقل الهجوم: طلب HTTP POST مع JSON يحتوي على حقل
$typeيشير إلى فئة خطيرة (مثلSystem.Diagnostics.Process). - شرط الاستغلال: استخدام
JsonSerializerSettingsمعTypeNameHandling = TypeNameHandling.Allأو إعداد المسلسل يدويًا دون تقييد الأنواع. - النتيجة: تنفيذ أوامر النظام، قراءة الملفات، سرقة البيانات، أو السيطرة الكاملة على الخادم.
من هو المعرض للخطر؟
أثرت المشكلة على آلاف المشاريع، بما في ذلك:
- تطبيقات الويب على ASP.NET Core التي تستخدم Newtonsoft.Json (خاصة المشاريع القديمة).
- الخدمات المصغرة وواجهات API حيث يتم إلغاء تسلسل JSON دون تحقق صارم.
- تطبيقات سطح المكتب على WPF وألعاب Unity التي تتعامل مع بيانات خارجية.
توصيات للإصلاح
أصدر مطورو Newtonsoft.Json بالفعل تصحيحًا في الإصدار 13.0.3. ومع ذلك، وفقًا لبيانات القياس عن بُعد لـ NuGet، لا يزال حوالي 40% من المشاريع تستخدم إصدارات ضعيفة. إليك ما يجب فعله فورًا:
- قم بتحديث الحزمة: نفذ
Update-Package Newtonsoft.Json -Version 13.0.3في وحدة تحكم NuGet أو قم بالتحديث عبر مدير التبعيات. - قم بتعطيل TypeNameHandling: إذا كنت لا تستخدم إلغاء التسلسل متعدد الأشكال، فاضبط
TypeNameHandling = TypeNameHandling.None. - قم بتطبيق التحقق: استخدم
SerializationBinderللسماح صراحةً بالأنواع الآمنة فقط. - المراقبة: تحقق من سجلاتك بحثًا عن طلبات JSON غير طبيعية تحتوي على حقل
$type.
الخلاصة
هذه الثغرة هي تذكير بأنه حتى المكتبات الناضجة يمكن أن تحتوي على أخطاء حرجة. يجب على مطوري C# ليس فقط تحديث Newtonsoft.Json، ولكن أيضًا إعادة النظر في بنية التسلسل: النظر في الترحيل إلى System.Text.Json (المدمج في .NET 6+) والذي هو أكثر أمانًا افتراضيًا، أو تكوين قواعد صارمة لإلغاء التسلسل. لا تؤجل التحديث - فالمهاجمون يقومون بالفعل بمسح الإنترنت بنشاط بحثًا عن خوادم ضعيفة.