TypeInitializationException을 SQL Server CLR 실행이 실패합니다.

이 문서에서는 CLR 개체의 실행이 실패하는 문제를 SQL Server System.TypeInitializationException 예외를 반환합니다.

다음에 적용됩니다.   SQL Server
원래 KB 번호:   4576575

증상

중요

이 문서에는 보안 설정을 낮추는 방법이나 컴퓨터에서 보안 기능을 해제하는 방법을 보여 주는 정보가 포함되어 있습니다. 이러한 변경을 통해 특정 문제를 해결하도록 할 수 있습니다. 이러한 변경을 적용하기 전에 특정 환경에서 이 해결 방법을 구현하는 데 관련된 위험을 평가하는 것이 좋습니다. 이 해결 단계를 구현하는 경우 적절한 추가 단계를 수행하여 컴퓨터를 보호합니다.

CVE-2020-1147에설명된 취약점을 해결하기 위해 적용 가능한 .NET Framework 업데이트를 설치한 후 DataSet 및 DataTable 보안 지침 개체로 XML을 읽는 CLR(공용 언어 런타임) 통합을 통해 데이터베이스 개체 구축이 실패합니다. 이는 FileNotFoundException 예외가 중첩된 System.TypeInitializationException 예외 때문에 발생합니다. 이 문제는 System.Drawing 어셈블리를 로드할 수 없다고 나타냅니다.

참조는 다음 예제를 참고하십시오.

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: 'Scope'에 대한 형식 이니셜라이저에서 예외가 발생했습니다. ---> System.IO.FileNotFoundException: 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken= ' 또는 해당 종속성 중 하나를 로드할 수 <Token> 없습니다. 지정된 파일을 찾을 수 없습니다.
System.TypeInitializationException:
System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(Type type)
System.Data.TypeLimiter.Scope.IsAllowedType(Type type)
System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter)의 System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)
는 System.Data.DataColumn.에서 사용할 수 있습니다. ctor(String columnName, Type dataType, String expr, MappingType type)
System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable 테이블, Boolean isBase)
System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable 테이블, ArrayList tableChildren, Boolean isBase)
System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
System.Data.XSDSchema.InstantiateTable(XmlSchemaElement 노드, XmlSchemaComplexType typeNode, Boolean isRef)
System.Data.XSDSchema.HandleTable(XmlSchemaElement 노드)
System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable 테이블, ArrayList tableChildren, Boolean isBase)
System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
System.Data.XSDSchema.InstantiateTable(XmlSchemaElement 노드, XmlSchemaComplexType typeNode, Boolean isRef)
System.Data.XSDSchema.HandleTable(XmlSchemaElement 노드)
System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
System.Data.DataSet.InferSchema(XmlDocument xdoc, String[] excludedNamespaces, XmlReadMode 모드)
System.Data.Data...

해결 방법

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

패치를 얻는 방법을 비롯한 자세한 내용은 .NET Framework 2020년 7월보안 전용 업데이트의 다시 게시를 참조하세요.

해결 방법

경고

이 해결 방법으로 컴퓨터 또는 네트워크가 악의적인 사용자나 바이러스와 같은 악성 소프트웨어에 의해 공격에 더 취약해집니다. 이 해결 방법을 권장하지는 않지만 사용자 재량에 따라 이 해결 방법을 구현할 수 있도록 이 정보를 제공합니다. 그러므로 이 해결 방법을 사용하여 발생하는 모든 위험은 전적으로 사용자 책임입니다.

트러스터화되지 않은 XML 데이터를 개체의 인스턴스로 위임하는 응용 프로그램의 경우 다른 방법을 사용하여 데이터에 액세스하는 DataSet DataTable 것이 좋습니다. 신뢰할 수 있는 XML 데이터만 읽는 응용 프로그램의 경우 다음 해결 방법을 시도해 볼 수 있습니다.

참고

변경 내용이 로컬로 적용된 것이기 때문에 해결 방법은 1과 2가 선호됩니다. 해결사용자 3은 시스템 전체에 있습니다.

경고

이러한 해결을 통해 XML을 및 개체의 인스턴스로 서사화하기 위한 형식 제한이 DataSet DataTable 제거됩니다. 이 경우 응용 프로그램이 트러설되지 않은 입력을 읽는 경우 보안 구멍이 열립니다.

  • 해결 프로그램 1: AppContext.SetSwitch 호출

    CLR 개체 SQL 시작을 변경하여Switch.Sys tem을 설정하십시오. Data.AllowArbitraryDataSetTypeInstantiation 스위치를 true로 전환합니다. CLR 개체에 적용 가능한 모든 SQL 합니다. 아래 예제를 참고하십시오.

    AppContext.SetSwitch

    자세한 내용은 DataSet 및 DataTable 보안 지침을 참조하세요.

  • 해결사 2: 적용 가능한 각 인스턴스에 대한 Sqlservr.exe.config파일 만들기 또는 변경

    이 해결은 인스턴스 자체에만 적용됩니다.

    중요

    이러한 변경은 업데이트 또는 인스턴스 업그레이드에 의해 덮어 SQL Server 않습니다. 인스턴스 업데이트 또는 업그레이드 후에도 변경이 지속될지 여부를 확인하는 것이 좋습니다.

    1. 기본 인스턴스Sqlservr.exe.config 명명된 인스턴스의 파일 위치에서 파일 파일을 SQL Server.

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

    2. 노드 내에서 중첩된 노드 외부에 <runtime> 다음 줄을 추가합니다.

      <AppContextSwitchOverrides value="Switch.System.Data. AllowArbitraryDataSetTypeInstantiation=true"/>
      
    3. 파일을 저장하고 인스턴스를 다시 시작합니다.

      2016 인스턴스의 SQL Server 참조합니다.

      코드 예

  • 해결사법 3: System.Drawing 어셈블리 만들기

    GAC(전역 어셈블리 SQL Server)의 DLL 파일에서 System.Drawing 어셈블리를 수동으로 만든 다음 DataSet.ReadXML 또는 DataTable.ReadXML을 사용하는 어셈블리를 다시 만드하십시오. 예를 들면 다음과 같습니다.

    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
    
  • 해결사용자 4: 레지스트리 하위 키 만들기

    중요

    이 해결 작업의 단계를 신중하게 따르세요. 레지스트리를 잘못 수정하면 심각한 문제가 발생할 수 있습니다. 레지스트리를 수정하기 전에 문제가 발생할 경우에 대비하여 레지스트리를 복원 가능하도록 백업하세요.

    이 해결 프로그램은 서버의 모든 .NET 응용 프로그램에 영향을 미치게 됩니다. 따라서 다른 해결 방법을 사용할 수 없는 경우 이 메서드를 마지막 수단으로만 사용해야 합니다.

    1. 레지스트리 편집기를 엽니다.

    2. 다음 하위 키가 찾습니다.

      KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext

    3. 다음과 REG_SZ 값을 만들 수 있습니다.

      이름 Switch.System. Data.AllowArbitraryDataSetTypeInstantiation
      true
    4. 모든 SQL Server 다시 시작합니다.

      아래 예제를 참고하십시오.

      키 예제

추가 정보

이 문제는 최신 보안 업데이트의 작업으로 인해 .NET Framework XML 콘텐츠 .NET Framework 수정한 것입니다. SQL Server XML을 읽지 않는 CLR 개체나 개체의 인스턴스는 DataSet DataTable 영향을 받지 않습니다.