Sumário
A actualização de segurança MS11-100 da Microsoft limita o número máximo de chaves de formulários, ficheiros e membros JSON para 1000 num pedido HTTP. Devido a esta alteração, as aplicações ASP.NET rejeitam os pedidos que possuam mais de 1000 destes elementos. Os clientes HTTP que efectuam estes tipos de pedidos serão negados e aparecerá uma mensagem de erro no browser. A mensagem de erro terá geralmente um código de estado HTTP 500. Este novo limite pode ser configurado numa base por aplicação. Consulte a secção "Resolução" para ver as instruções de configuração.
Sintomas
Os pedidos ASP.NET que possuam muitas chaves de formulários, ficheiros ou payloads JSON recebem uma resposta de erro do servidor. O registo da Aplicação no servidor possui uma entrada de Aviso com uma Origem que é uma versão específica do ASP.NET e uma ID do Evento de 1309. O registo do evento contém uma das mensagens seguintes:
Mensagem 1:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>
Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool
Informações da excepção:
Tipo de excepção: HttpException
Mensagem de excepção: Os dados de formulário com codificação URL não são válidos.
em System.Web.HttpRequest.FillInFormCollection()
em System.Web.HttpRequest.get_Form()
em System.Web.HttpRequest.get_HasForm()
em System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
em System.Web.UI.Page.DeterminePostBackMode()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Mensagem 2:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>
Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool
Informações da excepção:
Tipo de excepção: InvalidOperationException
Mensagem de excepção: A operação não é válida devido ao estado actual do objecto.
em System.Web.HttpRequest.FillInFilesCollection()
em System.Web.HttpRequest.get_Files()
em FileUpload.Page_Load(Object sender, EventArgs e)
em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
em System.Web.UI.Control.OnLoad(EventArgs e)
em System.Web.UI.Control.LoadRecursive()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint
Mensagem 3:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>
Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool
Informações da excepção:
Tipo de excepção: InvalidOperationException
Mensagem de excepção: A operação não é válida devido ao estado actual do objecto.
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
em System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
em System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
em Failing.Page_Load(Object sender, EventArgs e)
em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
em System.Web.UI.Control.OnLoad(EventArgs e)
em System.Web.UI.Control.LoadRecursive()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
O ficheiro de registo dos IIS mostra uma entrada semelhante à que se segue:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187
Causa
A actualização de segurança da Microsoft que o boletim de segurança MS11-100 corrige altera o número predefinido máximo de chaves de formulários, ficheiros e membros JSON que o ASP.NET irá aceitar num pedido para 1000. Esta alteração foi feita para corrigir a vulnerabilidade ao Denial of Service que o boletim de segurança MS11-100 da Microsoft refere.
Resolução
As aplicações que atingem este limite para chaves de formulários ou ficheiros podem modificar a appSetting do ASP.NET aspnet:MaxHttpCollectionKeys, conforme indicado abaixo num ficheiro de configuração de uma aplicação ASP.NET. Esta definição corrige a mensagem 1 de erro e a mensagem 2 de erro da secção "Sintomas".
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>
Nota Se estiver a utilizar o ASP.NET 1.1 num sistema baseado em x86, a definição é ajustada acrescentando um valor DWORD à seguinte chave de registo:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Se estiver a utilizar o ASP.NET 1.1 num sistema baseado em x64, a definição é ajustada acrescentando um valor DWORD à seguinte chave de registo:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
As aplicações que atingem este limite para payloads JSON podem modificar a appSetting do ASP.NET aspnet:MaxJsonDeserializerMembers, conforme indicado abaixo num ficheiro de configuração de uma aplicação ASP.NET. Esta definição corrige a mensagem 3 de erro da secção "Sintomas".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>
Nota Aumentar este valor para acima da predefinição aumenta a susceptibilidade do seu servidor à vulnerabilidade ao Denial of Service, que é discutida no boletim de segurança MS11-100.
Referências
Para obter mais informações sobre o boletim de segurança MS11-100, consulte o seguinte artigo da TechNet:
Boletim de Segurança da Microsoft MS11-100 - Crítico Para obter mais informações, clique no número de artigo seguinte para visualizar o artigo na Base de Dados de Conhecimento Microsoft:
2638420 MS11-100: Vulnerabilidade no .NET Framework pode permitir a elevação de privilégios: 29 de Dezembro de 2011