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 includeStagesBeforeAsyncPoint
Komunikat 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