La actualización de seguridad MS11-100 de Microsoft limita el número máximo de miembros JSON, archivos y claves de formulario a 1000 en una solicitud HTTP. Debido a este cambio, las aplicaciones ASP.NET rechazan las solicitudes que contengan una cantidad de estos elementos superior a 1000. Los clientes HTTP que realicen estos tipos de solicitudes serán denegados y aparecerá un mensaje de error en el explorador web. El mensaje de error tendrá normalmente un código de estado HTTP 500. Este nuevo límite puede configurarse en función de las aplicaciones. Consulte la sección "Resolución" para obtener instrucciones de configuración.
Resumen
Las solicitudes ASP.NET que contienen mucha carga JSON, archivos o claves de formulario reciben una respuesta de error del servidor. El registro de Aplicación del servidor tiene una entrada de Advertencia con un Origen que es una versión específica de ASP.NET y un id. de evento de 1309. El registro de eventos contiene uno de los mensajes siguientes:
Mensaje 1:
Información de la aplicación:
Dominio de aplicación: /LM/W3SVC/1/ROOT/<Dominio de aplicación>
Nivel de confianza: Medio
Ruta de acceso virtual de la aplicación: <Ruta de acceso de VDIR>
Ruta de acceso de la aplicación: <Ruta de acceso de la aplicación>
Nombre del equipo: <Nombre del equipo>
Información de proceso:
Id. de proceso: 0001
Nombre del proceso: w3wp.exe
Nombre de cuenta: IIS APPPOOL\DefaultAppPool
Información de excepción:
Tipo de excepción: HttpException
Mensaje de excepción: Los datos de formulario con codificación URL no son válidos.
en System.Web.HttpRequest.FillInFormCollection()
en System.Web.HttpRequest.get_Form()
en System.Web.HttpRequest.get_HasForm()
en System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
en System.Web.UI.Page.DeterminePostBackMode()
en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Mensaje 2:
Información de la aplicación:
Dominio de aplicación: /LM/W3SVC/1/ROOT/<Dominio de aplicación>
Nivel de confianza: medio
Ruta de acceso virtual de la aplicación: <ruta de acceso de VDIR>
Ruta de acceso de la aplicación: <ruta de acceso de la aplicación>
Nombre del equipo: <nombre del equipo>
Información del proceso:
Id. del proceso: 0001
Nombre del proceso: w3wp.exe
Nombre de cuenta: IIS APPPOOL\DefaultAppPool
Información de excepción:
Tipo de excepción: InvalidOperationException
Mensaje de excepción: La operación no es válida debido al estado actual del objeto.
en System.Web.HttpRequest.FillInFilesCollection()
en System.Web.HttpRequest.get_Files()
en FileUpload.Page_Load(Object sender, EventArgs e)
en System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
en System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
en System.Web.UI.Control.OnLoad(EventArgs e)
en System.Web.UI.Control.LoadRecursive()
en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint
Mensaje 3:
Información de la aplicación:
Dominio de aplicación: /LM/W3SVC/1/ROOT/<Dominio de aplicación>
Nivel de confianza: medio
Ruta de acceso virtual de la aplicación: <ruta de acceso de VDIR>
Ruta de acceso de la aplicación: <ruta de acceso de la aplicación>
Nombre del equipo: <nombre del equipo>
Información del proceso:
Id. del proceso: 0001
Nombre del proceso: w3wp.exe
Nombre de cuenta: IIS APPPOOL\DefaultAppPool
Información de excepción:
Tipo de excepción: InvalidOperationException
Mensaje de excepción: la operación no es válida debido al estado actual del objeto.
en System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
en System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
en System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
en System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
en System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
en Failing.Page_Load(Object sender, EventArgs e)
en System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
en System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
en System.Web.UI.Control.OnLoad(EventArgs e)
en System.Web.UI.Control.LoadRecursive()
en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
El archivo de registro de IIS muestra una entrada similar a la siguiente:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187
Síntomas
La actualización de seguridad de Microsoft a la que se refiere el boletín de seguridad MS11-100 cambia el número máximo predeterminado de miembros JSON, archivos y claves de formulario que ASP.NET aceptará en una solicitud a 1000. Se ha realizado este cambio para solucionar la vulnerabilidad de denegación de servicio que documenta el boletín de seguridad MS11-100 de Microsoft.
Causa
Las aplicaciones que alcanzan este límite de archivos o claves de formulario pueden modificar el appSetting de ASP.NET aspnet:MaxHttpCollectionKeys, como se muestra a continuación en un archivo de configuración de la aplicación ASP.NET. Esta configuración soluciona el mensaje de error 1 y el mensaje de error 2 de la sección "Síntomas".
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>
Nota: si utiliza ASP.NET 1.1 en un sistema basado en x86, la configuración se cambia agregando un valor DWORD a la siguiente clave del Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Si utiliza ASP.NET 1.1 en un sistema basado en x64, la configuración se cambia agregando un valor DWORD a la siguiente clave del Registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Las aplicaciones que alcanzan este límite con las cargas JSON pueden modificar el appSetting de ASP.NET aspnet:MaxJsonDeserializerMembers, como se muestra a continuación en un archivo de configuración de la aplicación ASP.NET. Esta configuración soluciona el mensaje de error 3 de la sección "Síntomas".
<configuración>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>
Nota: si aumenta este valor en la configuración predeterminada, aumenta la probabilidad de que su servidor sufra la vulnerabilidad de denegación de servicio que se trata en el boletín de seguridad MS11-100.
Solución
Para obtener más información acerca del boletín de seguridad MS11-100, consulte el siguiente artículo de TechNet:
Microsoft Security Bulletin MS11-100 - crítica Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
2638420 MS11-100: una vulnerabildad en .NET Framework podría permitir la elevación de privilegios: 29 de diciembre de 2011