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: 0001Nome 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: 0001Nome 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