Streszczenie
Aktualizacja zabezpieczeń firmy Microsoft MS11-100 ogranicza maksymalną liczbę kluczy formularzy, plików i elementów JSON w żądaniu HTTP do 1000. Z powodu tej zmiany aplikacje ASP.NET odrzucają żądania zawierające więcej niż 1000 tych elementów. Tego rodzaju żądania wysyłane przez klienta HTTP zostają odrzucone, a w przeglądarce sieci Web pojawia się komunikat o błędzie. Komunikat o błędzie ma zwykle kod stanu HTTP 500. Ten nowy limit można skonfigurować dla poszczególnych aplikacji. Instrukcje dotyczące konfiguracji zawarto w sekcji „Rozwiązanie”.
Symptomy
Na żądania ASP.NET zawierające wiele kluczy formularzy, plików lub elementów JSON serwer odpowiada komunikatem o błędzie. W dzienniku aplikacji na serwerze znajduje się wpis ostrzeżenia, w którym jako Źródło wskazana jest konkretna wersja programu ASP.NET, a zdarzenie ma identyfikator 1309. Dziennik zdarzeń zawiera jeden z następujących komunikatów:
Komunikat 1:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji> Poziom zaufania: Średni Ścieżka wirtualna aplikacji: <ścieżka_VDIR> Ścieżka aplikacji: <ścieżka_aplikacji> Nazwa komputera: <nazwa_komputera> Informacje o procesie: Identyfikator procesu: 0001 Nazwa procesu: w3wp.exe Nazwa konta: IIS APPPOOL\DefaultAppPool Informacje o wyjątku: Typ wyjątku: HttpException Komunikat o wyjątku: Dane formularza kodowane za pomocą adresu URL są nieprawidłowe. w System.Web.HttpRequest.FillInFormCollection() w System.Web.HttpRequest.get_Form() w System.Web.HttpRequest.get_HasForm() w System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull) w System.Web.UI.Page.DeterminePostBackMode() w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)Komunikat 2:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji> Poziom zaufania: Średni Ścieżka wirtualna aplikacji: <ścieżka_VDIR> Ścieżka aplikacji: <ścieżka_aplikacji> Nazwa komputera: <nazwa_komputera> Informacje o procesie: Identyfikator procesu: 0001 Nazwa procesu: w3wp.exe Nazwa konta: IIS APPPOOL\DefaultAppPool Informacje o wyjątku: Typ wyjątku: InvalidOperationException Komunikat o wyjątku: Ze względu na bieżący stan obiektu operacja jest nieprawidłowa. w System.Web.HttpRequest.FillInFilesCollection() w System.Web.HttpRequest.get_Files() w FileUpload.Page_Load(Object sender, EventArgs e) w System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) w System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) w System.Web.UI.Control.OnLoad(EventArgs e) w System.Web.UI.Control.LoadRecursive() w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPointKomunikat 3:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji> Poziom zaufania: Średni Ścieżka wirtualna aplikacji: <ścieżka_VDIR> Ścieżka aplikacji: <ścieżka_aplikacji> Nazwa komputera: <nazwa_komputera> Informacje o procesie: Identyfikator procesu: 0001 Nazwa procesu: w3wp.exe Nazwa konta: IIS APPPOOL\DefaultAppPool Informacje o wyjątku: Typ wyjątku: InvalidOperationException Komunikat o wyjątku: Ze względu na bieżący stan obiektu operacja jest nieprawidłowa. w System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) w System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) w System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer) w System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) w System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input) w Failing.Page_Load(Object sender, EventArgs e) w System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) w System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) w System.Web.UI.Control.OnLoad(EventArgs e) w System.Web.UI.Control.LoadRecursive() w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)W dzienniku programu IIS znajduje się wpis podobny do następującego:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187
Przyczyna
Aktualizacja zabezpieczeń firmy Microsoft opisana w biuletynie zabezpieczeń MS11-100 zmienia domyślną maksymalną liczbę kluczy formularzy, plików i elementów JSON akceptowaną w żądaniu przez program ASP.NET na 1000. Tę zmianę wprowadzono w celu wyeliminowania luki w zabezpieczeniach umożliwiającej atak typu „odmowa usługi” udokumentowanej w biuletynie zabezpieczeń firmy Microsoft MS11-100.
Rozwiązanie
W przypadku aplikacji, które osiągają ten limit dla kluczy formularzy lub plików, można zmodyfikować pozycję programu ASP.NET appSetting aspnet:MaxHttpCollectionKeys, jak pokazano poniżej, w pliku konfiguracji aplikacji ASP.NET. To ustawienie rozwiązuje problem z komunikatami o błędach 1 i 2 z sekcji „Symptomy”.
<configuration>
<appSettings> <add key="aspnet:MaxHttpCollectionKeys" value="1000" /> </appSettings> </configuration>
Uwaga W razie używania wersji ASP.NET 1.1 w systemie opartym na procesorach x86 to ustawienie dopasowuje się, dodając wartość DWORD do następującego klucza rejestru:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
W razie używania wersji ASP.NET 1.1 w systemie opartym na procesorach x64 to ustawienie dopasowuje się, dodając wartość DWORD do następującego klucza rejestru:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
W przypadku aplikacji, które osiągają ten limit dla ładunków JSON, można zmodyfikować pozycję programu ASP.NET appSetting aspnet:MaxJsonDeserializerMembers, jak pokazano poniżej, w pliku konfiguracji aplikacji ASP.NET. To ustawienie rozwiązuje problem z komunikatem o błędzie 3 z sekcji „Symptomy”.
<configuration>
<appSettings> <add key="aspnet:MaxJsonDeserializerMembers" value="1000" /> </appSettings> </configuration>
Uwaga Zwiększenie powyższej wartości ponad ustawienie domyślne zwiększa podatność serwera na zagrożenie atakiem typu „odmowa usługi” z wykorzystaniem luki w zabezpieczeniach omówionej w biuletynie zabezpieczeń MS11-100.
Materiały referencyjne
Aby uzyskać więcej informacji o biuletynie zabezpieczeń MS11-100, zobacz następujący artykuł w witrynie TechNet:
Biuletyn zabezpieczeń MS11-100 firmy Microsoft — krytyczne Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2638420 MS11-100: Luka w zabezpieczeniach programu .NET Framework umożliwia podniesienie uprawnień: 29 grudnia 2011