
# نسخة .NET 7 من seal-security-nuget-demo: نفس قصة استغلال CVE-2024-21907، معاد توجيهها للعملاء المقيدين بـ .NET SDK 7.
هذا فرع مُعاد توجيهه من المستودع الأساسي seal-security-nuget-demo (الذي يستهدف net9.0). قصة الاستغلال، ووحدات التحكم، وقائمة الحزم المختومة متطابقة — الفرق الوحيد هو TargetFramework.
هذا الفرع موجود لأن معظم عملاء المؤسسات لا يمكنهم الانتقال إلى أحدث .NET SDK عند الطلب. وصل .NET 7 إلى نهاية الدعم في 14 مايو 2024، لكن بيئات الإنتاج الفعلية لا تزال تعمل عليه لأسباب تتعلق بالتوافق أو الشهادات أو التشغيل. هذه هي الحالة التي صُمم Seal Security من أجلها تحديدًا: عندما لا يستطيع العميل (أو لا يريد) أخذ قفزة في الإصدار الرئيسي، يقوم Seal بتصحيح الاعتماد الضعيف في مكانه تحت نفس الإصدار، دون أي تغيير في واجهة برمجة التطبيقات العامة ودون تعديلات على كود تطبيق العميل. هذا العرض التوضيحي يتيح إجراء هذه المحادثة على البنية الفعلية للعميل بدلاً من مطالبتهم بتثبيت net8/net9 أولاً.
الفرع يثبّت SDK على 7.0.x عبر global.json حتى لا تتسلل الترقيات العرضية أثناء العرض التوضيحي.
هذا التطبيق التوضيحي هو صفحة ترحيب ASP.NET Core بسيطة تستخدم Newtonsoft.Json 12.0.2 لتحليل إدخال المستخدم ككائن إعدادات. التطبيق يحتوي على حقل اسم — اكتب اسمك، انقر على "Go"، وسيعرض "Welcome, alice!". في الخلفية، يمرر الإدخال عبر JsonConvert.DeserializeObject<NestedConfig>() من Newtonsoft.Json. هذا كل شيء — استخدام قياسي تمامًا لمكتبة JSON شائعة.
المشكلة أن Newtonsoft.Json 12.0.2 (والإصدارات قبل 13.0.1) لديه CVE-2024-21907 — ثغرة رفض خدمة عالية الخطورة بدرجة CVSS 7.5 (عالية). هذا العرض التوضيحي يوضح كيف يقوم Seal Security بتصحيح الثغرة في مكانها دون الحاجة إلى ترقية الإصدار الرئيسي.
يمكن استغلال طريقة JsonConvert.DeserializeObject<T>() في Newtonsoft.Json من خلال صياغة حمولات JSON متداخلة بعمق. عند إلغاء التسلسل إلى كائن مكتوب (POCO)، يقوم JsonSerializerInternalReader في المكتبة باستدعاءات تكرارية حقيقية (CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue → CreateValueInternal) تسبب تجاوز سعة المكدس، مما يؤدي إلى تعطل التطبيق (رفض الخدمة).
يأخذ التطبيق إدخال المستخدم ويحلله عبر Newtonsoft.Json. إذا كان الإدخال عنوان URL، يقوم التطبيق بجلب المحتوى أولاً — نمط واقعي تستخدمه محملات الإعدادات، ومختبري واجهات برمجة التطبيقات، ومستقبلات webhook:
public class NestedConfig
{
[JsonProperty("n")]
public NestedConfig? N { get; set; }
}
var config = JsonConvert.DeserializeObject<NestedConfig>(name);
إدخال عادي: اكتب alice → يعرض "Welcome, alice!"
استغلال: الصق هذا الرابط في حقل الاسم وانقر على Go:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
يكتشف التطبيق أنه عنوان URL، يجلب json-payload (JSON متداخل بعمق {"n":{"n":{...}}})، ويقوم بإلغاء تسلسله عبر Newtonsoft.Json إلى فئة NestedConfig التكرارية — مما يسبب تجاوز سعة المكدس.
يقوم JsonSerializerInternalReader بالتكرار عبر CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue لكل مستوى تداخل. عند حوالي 5,000 مستوى عمق، يستنفد هذا مكدس الخيط ويتعطل التطبيق مع StackOverflowException — تموت العملية فورًا (لا يمكن معالجة الأخطاء بشكل أنيق).
بهذه الثغرة، يمكن للمهاجمين:
الإصلاح المتاح للعموم يتطلب الترقية إلى الإصدار 13.0.1. ومع ذلك، فإن ترقية الإصدارات الرئيسية غالبًا ما تقدم:
هذا يجعل إصلاح "فقط قم بالترقية" مشروعًا يمكن أن يستغرق بسهولة أسابيع من وقت المطورين — تاركًا الثغرة مفتوحة في هذه الأثناء.
نسخة Seal المصححة (12.0.2-sp1) تضيف حماية عمق التكرار دون تغيير أي واجهة برمجة تطبيقات عامة. التصحيح:
MaxDepth افتراضية لمنع التكرار غير المحدودهذه هي نفس استراتيجية التخفيف المطبقة في Newtonsoft.Json 13.0.1، مُعاد نقلها إلى 12.0.2 كبديل مباشر.
هذا العرض التوضيحي يتضمن أيضًا حزم NuGet ضعيفة أخرى يمكن لـ Seal Security تصحيحها:
ثغرة كيان خارجي XML (XXE) في تحليل إعدادات XML في log4net. المهاجم الذي يمكنه التحكم في ملف إعدادات log4net يمكنه:
ملاحظة حول
System.Net.Http: العرض التوضيحي الأساسي net9 يشمل أيضًا مرجعSystem.Net.Http 4.3.0الضعيف لـ CVE-2017-0249. لقد حذفناه من هذا الفرع net7 لأنه على .NET 7 فإنSystem.Net.Httpجزء من BCL ومرجع الحزمة المستقل هو حزمة وصفية أثرية — لها حالات حافة معروفة معdotnet add package --source <local-nupkg>، وهو بالضبط كيف يطبق Seal CLI الإصدارات المختومة. حذفه يجعل خطوةseal fixموثوقة دون تغيير قصة العرض التوضيحي (HttpClientلا يزال يعمل بشكل جيد؛ وقت التشغيل يوفره).
تم إيقاف ملفات CLI الثنائية لنظام Windows بعد v0.3.238. الإصدار v0.3.238 كامل الوظائف لمعالجة NuGet على Windows.
دليل تفصيلي لتثبيت وتشغيل Windows Server موجود في README-WINDOWS-SERVER.md. البداية السريعة أدناه تغطي نفس الخطوات بشكل مختصر.
PowerShell:
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
cd seal-security-nuget-demo-net7
# الاستعادة (يسحب من nuget.org وخلاصة Seal — انظر nuget.config)
dotnet restore
# البناء والتشغيل
dotnet build
dotnet run
افتح http://localhost:5000 — التطبيق يعمل مع اعتماديات ضعيفة.
اكتب alice في حقل الاسم، انقر على Go. يجب أن ترى: "Welcome, alice!"
الصق الرابط التالي في حقل الاسم وانقر على Go:
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json
النتيجة غير المصححة: المتصفح يعرض خطأ / إعادة تعيين الاتصال — التطبيق تعطل مع StackOverflowException في JsonSerializerInternalReader.CreateValueInternal. العملية ميتة.
# (اختياري — تم بالفعل أعلاه) استعادة الاعتماديات أولاً
dotnet restore
# تشغيل Seal CLI لإصلاح الثغرات
seal fix . --mode remote -v
# الاستعادة مرة أخرى لسحب الإصدارات المختومة
dotnet restore
# بناء وتشغيل التطبيق المصحح
dotnet build
dotnet run
التطبيق الآن يستخدم إصدارات مصححة (Newtonsoft.Json 12.0.2-sp1, log4net 2.0.5-sp1).
النتيجة المصححة: الصق نفس رابط الاستغلال → الصفحة تعرض "Blocked by Seal patch: MaxDepth of 64 has been exceeded." — حد التكرار المصحح في Newtonsoft.Json رفض الحمولة العميقة. الخادم يستمر في العمل بشكل طبيعي.
dotnet list package
يجب أن ترى حزمًا باحقة -sp1 تشير إلى تصحيحات Seal Security.
يجب إضافة خطوة CLI مباشرة بعد تثبيت الاعتماديات ولكن قبل البناء النهائي.
# 1. استعادة الاعتماديات
dotnet restore
# 2. <--- تشغيل Seal CLI هنا
$env:SEAL_TOKEN = "your-seal-token-here"
$env:SEAL_PROJECT = "nuget-demo-net7"
seal fix . --mode remote -v
# 3. الاستعادة مرة أخرى (للحصول على الإصدارات المختومة)
dotnet restore
# 4. البناء
dotnet build
| الوضع | الوصف |
|---|---|
all | تطبيق جميع الإصلاحات المتاحة تلقائيًا |
remote | تطبيق الإصلاحات المعتمدة فقط في واجهة Seal |
local | تطبيق الإصلاحات المعرفة فقط في .seal-actions.yml |
.seal-actions.yml في هذا المستودع يسرد بالفعل التجاوزات المختومة الثلاثة لوضع local، لذا seal fix . --mode local -v يعمل دون اتصال (لا يزال يحتاج رمزًا لخادم القطع الأثرية).
nuget.config مُعد مسبقًا لاستخدام Seal Security مع متغيرات البيئة:
<configuration>
<packageSources>
<add key="Seal" value="https://nuget.sealsecurity.io/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceCredentials>
<Seal>
<add key="Username" value="%SEAL_PROJECT%" />
<add key="ClearTextPassword" value="%SEAL_TOKEN%" />
</Seal>
</packageSourceCredentials>
</configuration>
| المتغير | الوصف |
|---|---|
SEAL_TOKEN | رمز الوصول الخاص بك لـ Seal Security |
SEAL_PROJECT | معرف المشروع (مثل nuget-demo-net7) |
يحتاج Seal CLI إلى HTTPS صادر (TCP 443) إلى:
cli.sealsecurity.io — تكوين الفحص/الإصلاحauthorization.sealsecurity.io — التحقق من الرمزnuget.sealsecurity.io — تنزيلات .nupkg المختومةd2zko6i8myndc4.cloudfront.net — CDN الذي يخدم القطع الأثرية المختومة الفعلية (أسماء النطاقات .sealsecurity.io تعيد التوجيه هنا)api.nuget.org / نقاط نهاية nuget.org القياسية — للاعتماديات غير المختومةتحقق من PowerShell بعد فتح جدار الحماية:
Test-NetConnection cli.sealsecurity.io -Port 443
Test-NetConnection authorization.sealsecurity.io -Port 443
Test-NetConnection nuget.sealsecurity.io -Port 443
Test-NetConnection d2zko6i8myndc4.cloudfront.net -Port 443
يجب أن يبلغ الجميع TcpTestSucceeded: True.
| العنصر | لماذا هو مهم |
|---|---|
global.json يثبت SDK على 7.0.x مع rollForward: latestFeature | يمنع الأجهزة التي تحتوي على net8/net9 جنبًا إلى جنب من تبديل SDKs بصمت أثناء العرض التوضيحي. |
System.Configuration.ConfigurationManager مثبت على 7.0.0 | العرض التوضيحي الأساسي net9 يستخدم 8.0.0، الذي يستهدف net8 فقط ويفشل في الاستعادة على net7. 7.0.0 له نفس سطح واجهة برمجة التطبيقات التي يحتاجها log4net. |
NU1701 مكبوت في csproj | log4net 2.0.5 يعلن عن TFM قديم net4x يقبله .NET 7 في وقت التشغيل لكنه يحذر عنه عند الاستعادة. التحذير تجميلي؛ الكبت يحافظ على نظافة مخرجات البناء أثناء العرض التوضيحي. |
| Seal CLI v0.3.238 لنظام Windows x64 | آخر إصدار مع ملف ثنائي لنظام Windows؛ كامل الوظائف لمعالجة NuGet. تم إيقاف ملفات Windows الثنائية بعد هذا الإصدار، لذا لا تقترح إصدارًا أحدث. |
12.0.2-sp1 بديل متوافق ثنائيًا لـ 12.0.2.الحزم المستخدمة في هذا العرض التوضيحي:
| الحزمة | الإصدار الضعيف | الإصدار المختوم | CVE | CVSS |
|---|---|---|---|---|
| Newtonsoft.Json | 12.0.2 | 12.0.2-sp1 | CVE-2024-21907 | 7.5 عالية |
| log4net | 2.0.5 | 2.0.5-sp1 | CVE-2018-1285 | 9.8 حرجة |
حزم NuGet مختومة أخرى متاحة من خلاصة Seal (ليست في هذا العرض التوضيحي، مدرجة للرجوع إليها):
| الحزمة | الإصدار الضعيف | الإصدار المختوم | CVE | CVSS |
|---|---|---|---|---|
| log4net | 2.0.0 | 2.0.0-sp1 | CVE-2018-1285 | 9.8 حرجة |
| System.Net.Http | 4.3.0 | 4.3.0-sp1 | CVE-2017-0249 | 7.3 عالية |
| Snappier | 1.1.0 | 1.1.0-sp1 | CVE-2023-28638 | 7.0 عالية |
| jQuery.Validation | 1.17.0 | 1.17.0-sp1 | CVE-2021-21252 | 7.5 عالية |
رخصة MIT — راجع ملف LICENSE للتفاصيل.