الموجز
يقصر التحديث الأمني من Microsoft رقم MS11-100 عدد مفاتيح النماذج والملفات وعناصر حمولات JSON لتصل إلى ١٠٠٠ بحد أقصى في طلب HTTP. وبسبب هذا التغيير، ترفض تطبيقات ASP.NET الطلبات التي تزيد فيها هذه العناصر عن ١٠٠٠. وسيتم رفض عملاء HTTP التي تقوم بإعداد هذه الأنواع من الطلبات، وستظهر رسالة خطأ في مستعرض الويب. وعادةً ما يكون لرسالة الخطأ رمز الحالة HTTP 500. يمكن تكوين هذا الحد الجديد على أساس كل تطبيق. الرجاء مراجعة القسم "الحل" للحصول على إرشادات التكوين.
الأعراض
تتلقى طلبات ASP.NET ـ التي تحتوي على الكثير من مفاتيح النماذج أو الملفات أو حمولة JSON ـ استجابة خطأ من الخادم. ويتضمن سجل التطبيقات الموجود على الخادم إدخال تحذيري يشتمل على مصدر يتمثل في نسخة خاصة من ASP.NET، و"مُعرّف الحدث" رقم ١٣٠٩. أما سجل الأحداث فيحتوي على واحدة من الرسائل التالية:
الرسالة الأولى:
معلومات التطبيق:
مجال التطبيق: /LM/W3SVC/1/ROOT/<App Domain>
مستوى الثقة: متوسط
المسار الظاهري للتطبيق: <VDIR Path>
مسار التطبيق: <App Path>
اسم الجهاز: <Machine Name>
معلومات العملية:
مُعرّف العملية: 0001
اسم العملية: w3wp.exe
اسم الحساب: IIS APPPOOL\DefaultAppPool
معلومات الاستثناء:
نوع الاستثناء: HttpException
رسالة الاستثناء: بيانات النموذج ذات ترميز عنوان URL غير صالحة.
في System.Web.HttpRequest.FillInFormCollection()
في System.Web.HttpRequest.get_Form()
في System.Web.HttpRequest.get_HasForm()
في System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
في System.Web.UI.Page.DeterminePostBackMode()
في System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
الرسالة الثانية:
معلومات التطبيق:
مجال التطبيق: /LM/W3SVC/1/ROOT/<App Domain>
مستوى الثقة: متوسط
المسار الظاهري للتطبيق: <VDIR Path>
مسار التطبيق: <App Path>
اسم الجهاز: <Machine Name>
معلومات العملية:
مُعرّف العملية: 0001
اسم العملية: w3wp.exe
اسم الحساب: IIS APPPOOL\DefaultAppPool
معلومات الاستثناء:
نوع الاستثناء: InvalidOperationException
رسالة الاستثناء: العملية غير صالحة بسبب الحالة الحالية للكائن.
في System.Web.HttpRequest.FillInFilesCollection()
في System.Web.HttpRequest.get_Files()
في FileUpload.Page_Load(Object sender, EventArgs e)
في System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
في System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
في System.Web.UI.Control.OnLoad(EventArgs e)
في System.Web.UI.Control.LoadRecursive()
في System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint
الرسالة الثالثة:
معلومات التطبيق:
مجال التطبيق: /LM/W3SVC/1/ROOT/<App Domain>
مستوى الثقة: متوسط
المسار الظاهري للتطبيق: <VDIR Path>
مسار التطبيق: <App Path>
اسم الجهاز: <Machine Name>
معلومات العملية:
مُعرّف العملية: 0001
اسم العملية: w3wp.exe
اسم الحساب: IIS APPPOOL\DefaultAppPool
معلومات الاستثناء:
نوع الاستثناء: InvalidOperationException
رسالة الاستثناء: العملية غير صالحة بسبب الحالة الحالية للكائن.
في System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
في System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
في System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
في System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
في System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
في Failing.Page_Load(Object sender, EventArgs e)
في System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
في System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
في System.Web.UI.Control.OnLoad(EventArgs e)
في System.Web.UI.Control.LoadRecursive()
في System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
يعرض ملف السجل IIS إدخالاً مشابهًا لما يلي:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187
السبب
يعمل التحديث الأمني من Microsoft ـالذي تتناوله نشرة الأمان رقم MS11-100ـ على تغيير الحد الأقصى الافتراضي لعدد مفاتيح النماذج والملفات وعناصر JSON التي سيقبلها تطبيق ASP.NET في أي طلب إلى ١٠٠٠. وقد تم إجراء هذا التغيير للتعامل مع ثغرة قطع الخدمة التي توثقها نشرة الأمان رقم MS11-100 من Microsoft.
الحل
يمكن للتطبيقات التي تصل إلى هذا الحد من حيث عدد مفاتيح النماذج أو الملفات تعديل ASP.NET appSetting aspnet:MaxHttpCollectionKeys، كما هو موضح أدناه في ملف التكوين الخاص بتطبيق ASP.NET. يتعامل هذا الإعداد مع رسالتي الخطأ الأولى والثانية في القسم "الأعراض".
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>
ملاحظة إذا كنت تستخدم ASP.NET 1.1 على نظام يستند إلى x86، فسيتم ضبط الإعداد عن طريق إضافة قيمة DWORD إلى مفتاح التسجيل التالي:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
إذا كنت تستخدم ASP.NET 1.1 على نظام يستند إلى x64، فسيتم ضبط الإعداد عن طريق إضافة قيمة DWORD إلى مفتاح التسجيل التالي:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
يمكن للتطبيقات التي تصل إلى هذا الحد فيما يتعلق بحمولات JSON تعديل ASP.NET appSetting aspnet:MaxJsonDeserializerMembers، كما هو موضح أدناه في ملف التكوين الخاص بتطبيق ASP.NET. يتعامل هذا الإعداد مع رسالة الخطأ الثالثة في القسم "الأعراض".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>
ملاحظة تؤدي زيادة هذه القيمة عن الإعداد الافتراضي إلى زيادة سرعة تأثر الخادم لديك بثغرة "قطع الخدمة" التي تناولناها في نشرة الأمان رقم MS11-100.
مراجع
لمزيد من المعلومات حول نشرة الأمان MS11-100، انظر مقالة TechNet التالية:
نشرة الأمان من Microsoft رقم MS11-100 - Critical لمزيد من المعلومات انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":
2638420 MS11-100: قد يسمح وجود ثغرة أمنية في .NET Framework برفع الامتيازات: 29 ديسمبر 2011