La ejecución de SQL Server CLR produce un error con TypeInitializationException

Este artículo le ayuda a solucionar el problema en el que se produce un error en la ejecución de SQL Server CLR y devuelve una excepción System.TypeInitializationException.

Se aplica a:   SQL Server
Número KB original:   4576575

Síntomas

Importante

Este artículo contiene información que muestra cómo ayudar a reducir la configuración de seguridad o cómo desactivar las características de seguridad en un equipo. Puede realizar estos cambios para solucionar un problema específico. Antes de realizar estos cambios, se recomienda evaluar los riesgos asociados con la implementación de esta solución alternativa en su entorno concreto. Si implementa esta solución alternativa, siga los pasos adicionales adecuados para ayudar a proteger el equipo.

Después de instalar una actualización de .NET Framework aplicable para corregir una vulnerabilidad que se describe en CVE-2020-1147,se produce un error en la ejecución de la creación de objetos de base de datos con la integración de Common Language Runtime (CLR) que lee XML en los objetos de guía de seguridad DataSet y DataTable. Esto se produce debido a una excepción System.TypeInitializationException que tiene una excepción FileNotFoundException anidada. Este problema indica que no se pudo cargar el ensamblado System.Drawing.

Para obtener referencia, vea el siguiente ejemplo:

Msg 6522, Level 16, State 1, Procedure [your CLR object], Line 0 [Batch Start Line 0] A .NET Framework error occurred during execution of user-defined routine or aggregate "your CLR object":
System.TypeInitializationException: el inicializador de tipo para "Scope" produjo una excepción. ---> System.IO.FileNotFoundException: no se pudo cargar el archivo o ensamblado 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken= ' ni una de sus <Token> dependencias. El sistema no encuentra el archivo especificado.
System.TypeInitializationException:
at System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(Type type)
at System.Data.TypeLimiter.Scope.IsAllowedType(Type type)
at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter) at System.Data.DataColumn.UpdateColumnType(Type, StorageType typeCode)
en System.Data.DataColumn.. ctor(String columnName, Type dataType, String expr, MappingType type)
at System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable table, Boolean isBase)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement node)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement node)
at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
at System.Data.DataSet.InferSchema(XmlDocument xdoc, String[] excludedNamespaces, XmlReadMode mode)
en System.Data.Data...

Solución

This issue has been fixed in the October 13, 2020 republishing of the .NET Framework July 2020 Security-Only Updates.

Para obtener más información, incluido cómo obtener la revisión, vea .NET Framework republishing of July 2020 Security Only Updates.

Solución alternativa

Advertencia

Esta solución alternativa puede hacer que un equipo o una red sea más vulnerable a los ataques de usuarios malintencionados o de software malintencionado, como virus. No se recomienda esta solución alternativa, pero se proporciona esta información para que pueda implementar esta solución alternativa según su criterio. Use esta solución alternativa bajo su propia responsabilidad.

Para las aplicaciones que deserializan datos XML que no son de confianza en una instancia de cualquiera de los objetos, se recomienda usar un método alternativo para tener acceso DataSet DataTable a los datos. Para las aplicaciones que solo leen datos XML de confianza, puede probar una de las siguientes soluciones alternativas.

Nota

Las soluciones alternativas 1 y 2 son preferibles porque los cambios se realizan localmente. La solución alternativa 3 es todo el sistema.

Advertencia

Estas soluciones alternativas quitan las restricciones de tipo para deserializar XML en instancias y DataSet DataTable objetos. Esto puede abrir un agujero de seguridad si la aplicación lee entradas que no son de confianza.

  • Solución alternativa 1: Llamar a AppContext.SetSwitch

    Cambie el inicio del código de SQL CLR para establecer elSwitch.System. Data.AllowArbitraryDataSetTypeInstantiation cambia a true. Debe hacerlo para cada objeto CLR SQL aplicable. Vea el ejemplo siguiente.

    AppContext.SetSwitch

    Para obtener más información, vea la guía de seguridad de DataSet y DataTable.

  • Solución alternativa 2: Crear o cambiar el Sqlservr.exe.config para cada instancia aplicable

    Esta solución alternativa solo se aplica a la propia instancia.

    Importante

    No podemos garantizar que este cambio no se sobrescriba mediante actualizaciones SQL Server actualizaciones de instancias o actualizaciones de instancia. Se recomienda determinar si el cambio persiste después de una actualización o actualización de instancia.

    1. Busque el Sqlservr.exe.config archivo en las ubicaciones de archivos para las instancias predeterminadas y con nombre de SQL Server:

      %ProgramFiles%\Microsoft SQL Server\<Instance_ID>.<Instance Name>\MSSQL\Binn\

    2. Dentro del <runtime> nodo, pero fuera de los nodos anidados, agregue la siguiente línea:

      <AppContextSwitchOverrides value="Switch.System.Data. AllowArbitraryDataSetTypeInstantiation=true"/>
      
    3. Guarde el archivo y reinicie la instancia.

      Vea el siguiente ejemplo de una SQL Server de 2016.

      Ejemplo de código

  • Solución alternativa 3: Crear el ensamblado System.Drawing

    Cree manualmente el ensamblado System.Drawing en SQL Server a partir del archivo DLL de la memoria caché global de ensamblados (GAC) y, a continuación, vuelva a crear ensamblados que usen DataSet.ReadXML o DataTable.ReadXML. Por ejemplo:

    CREATE ASSEMBLY [Drawing] FROM 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' WITH PERMISSION_SET = UNSAFE GO
    
  • Solución alternativa 4: Crear una subclave del Registro

    Importante

    Siga cuidadosamente los pasos de esta solución alternativa. La modificación incorrecta del Registro puede producir graves problemas. Antes de modificarlo, realice una copia de seguridad del Registro para efectuar una restauración en caso de que surjan problemas.

    Esta solución alternativa afectará a todas las aplicaciones .NET del servidor. Por lo tanto, debe usar este método solo como último recurso si no puede usar las otras soluciones alternativas.

    1. Abra el Editor del Registro.

    2. Busque la siguiente subclave:

      KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext

    3. Cree un REG_SZ, como se muestra a continuación.

      Nombre Switch.System. Data.AllowArbitraryDataSetTypeInstantiation
      Valor true
    4. Reinicie todas SQL Server instancias.

      Vea el ejemplo siguiente.

      Ejemplo clave

Más información

Este problema se debe a la acción de una actualización de seguridad reciente de .NET Framework para corregir la validación de marcado de contenido XML de .NET Framework. SQL Server objetos CLR que no leen XML en instancias de cualquiera de los objetos DataSet DataTable no se verán afectados.