TypeInitializationException을 SQL Server CLR 실행이 실패

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

적용된 사항은 다음에 해당합니다.   SQL Server
원래 KB 번호:   4576575

증상

중요

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

적용 가능한 .NET Framework 업데이트를 설치하여 CVE-2020-1147에설명된 취약점을 해결한 후, 데이터 집합 및 DataTable 보안 지침 개체에 XML을 읽는 CLR(Common Language Runtime) 통합을 실행하면 오류가 발생했습니다. 중첩된 FileNotFoundException 예외가 있는 System.TypeInitializationException 예외 때문에 발생합니다. 이 문제는 System.Drawing 어셈블리를 로드할 수 없다고 나타냅니다.

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

Msg 6522, 수준 16, 상태 1, 프로시저 [CLR 개체], 줄 0 [일괄 시작 줄 0] 사용자 정의 루틴을 실행하거나 "CLR 개체"를 집계하는 동안 .NET Framework 오류가 발생했습니다.
System.TypeInitializationException: 'Scope'의 형식 이니셜라이저에서 예외가 발생했습니다. ---> System.IO.FileNotFoundException: 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken= ' 또는 해당 종속성 중 하나를 로드할 수 <Token> 없습니다. 시스템에서 지정된 파일을 찾을 수 없습니다.
System.TypeInitializationException:
System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(형식)
System.Data.TypeLimiter.Scope.IsAllowedType(Type type)
System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter) at System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)
에서 .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 테이블, ArrayList tableChildren, Boolean isNillable)
System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, 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 테이블, ArrayList tableChildren, Boolean isNillable)
System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, 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.

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

해결 방법

경고

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

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

참고

해결 방법은 로컬에서 변경하기 때문에 1과 2가 우선적으로 설정됩니다. 해결사 3은 시스템 전체에 있습니다.

경고

이러한 해결을 통해 XML을 개체의 인스턴스와 인스턴스로 분리하기 위한 형식 제한이 DataSet DataTable 제거됩니다. 이 경우 응용 프로그램이 불안정한 입력을 읽는 경우 보안 구멍이 열립니다.

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

    CLR 개체 SQL 코드의 시작을 변경하여Switch.Sys 합니다. 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년 10월 인스턴스의 다음 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.Sys. Data.AllowArbitraryDataSetTypeInstantiation
      true
    4. 모든 SQL Server 다시 시작합니다.

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

      키 예제

추가 정보

이 문제는 .NET Framework XML 콘텐츠 마크업 유효성 검사를 수정하기 위해 최신 .NET Framework 보안 업데이트의 작업으로 인해 발생했습니다. SQL Server 개체의 인스턴스로 XML을 읽지 않는 CLR 개체는 DataSet DataTable 영향을 받지 않습니다.