Резюме
Актуализацията на защитата на Microsoft MS11-100 ограничава максималния брой ключове за формуляри, файлове и членове на JSON до 1000 в HTTP заявка. Поради тази промяна ASP.NET приложения отхвърлят заявки, които съдържат повече от 1000 от тези елементи. HTTP клиентите, които правят такива искания, ще бъдат отхвърлени и в уеб браузъра ще се появи съобщение за грешка. Съобщението за грешка обикновено ще има код на състоянието HTTP 500. Това ново ограничение може да бъде конфигурирано за всяко приложение. Вижте раздела "Решение" за инструкции за конфигуриране.
Симптоми
ASP.NET заявки, които съдържат много ключове за формуляри, файлове или полезен обем JSON, получават отговор за грешка от сървъра. Регистрационният файл на приложението на сървъра има предупредителен запис с източник, който е конкретна версия на ASP.NET, и ИД на събитие 1309. Регистърът на събитията съдържа едно от следните съобщения:
Съобщение 1:
Забележка
Информация за приложението:
Домейн на приложението: /LM/W3SVC/1/ROOT/<App Domain>
Ниво на доверие: Средно
Виртуален път на приложението: <Път на VDIR>
Път до приложението: <Път до приложение>
Име на машината: <Име на машината>
Информация за процеса:
ИД на процеса: 0001
Име на процеса: w3wp.exe
Име на акаунта: IIS APPPOOL\DefaultAppPool
Информация за изключения:
Тип изключение: HttpException
Съобщение за изключение: URL кодираните данни за формуляра не са валидни.
в System.Web.HttpRequest.FillInFormCollection()
в System.Web.HttpRequest.get_Form()
в System.Web.HttpRequest.get_HasForm()
at System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
в System.Web.UI.Page.DeterminePostBackMode()
в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Съобщение 2:
Забележка
Информация за приложението:
Домейн на приложението: /LM/W3SVC/1/ROOT/<App Domain>
Ниво на доверие: Средно
Виртуален път на приложението: <Път на VDIR>
Път до приложението: <Път до приложение>
Име на машината: <Име на машината>
Информация за процеса:
ИД на процеса: 0001
Име на процеса: w3wp.exe
Име на акаунта: IIS APPPOOL\DefaultAppPool
Информация за изключения:
Тип изключение: InvalidOperationException
Съобщение за изключение: Операцията не е валидна поради текущото състояние на обекта.
в System.Web.HttpRequest.FillInFilesCollection()
в System.Web.HttpRequest.get_Files()
в FileUpload.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at 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
Съобщение 3:
Забележка
Информация за приложението:
Домейн на приложението: /LM/W3SVC/1/ROOT/<App Domain>
Ниво на доверие: Средно
Виртуален път на приложението: <Път на VDIR>
Път до приложението: <Път до приложение>
Име на машината: <Име на машината>
Информация за процеса:
ИД на процеса: 0001
Име на процеса: w3wp.exe
Име на акаунта: IIS APPPOOL\DefaultAppPool
Информация за изключения:
Тип изключение: InvalidOperationException
Съобщение за изключение: Операцията не е валидна поради текущото състояние на обекта.
в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(дълбочина на Int32)
в 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, String input, Type type, Int32, depthLimit)
в System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
в Failing.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at 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
Причина
Актуализацията на защитата, която се адресира в бюлетина за сигурността MS11-100, променя максималния брой по подразбиране на ключовете за формуляри, файловете и членовете JSON, които ASP.NET приемат в заявка, на 1000. Тази промяна е направена за справяне с уязвимостта за отказ на услуга, която бюлетина на Microsoft за сигурността MS11-100 документи.
Решение
Приложенията, които достигат това ограничение за ключове за формуляри или файлове, могат да променят ASP.NET appSetting aspnet:MaxHttpCollectionKeys, както е показано по-долу в конфигурационния файл на ASP.NET приложение. Тази настройка адресира съобщение за грешка 1 и съобщение за грешка 2 от раздела "Симптоми".
<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 приложение. Тази настройка адресира съобщение за грешка 3 от раздела "Симптоми".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>
Забележка: Увеличаването на тази стойност над настройката по подразбиране увеличава чувствителността на вашия сървър към уязвимостта от типа отказ на услуга, която се обсъжда в бюлетина за сигурността MS11-100.
Справки
За повече информация относно бюлетина за сигурността MS11-100 вижте следната статия в TechNet:
Бюлетин на Microsoft за сигурността MS11-100 – Критичен За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:
2638420 MS11-100: Уязвимост в .NET Framework (платформа) може да позволи повишаване на привилегиите: 29 декември 2011 г.