다음을 통해 공유


TypeInitializationException으로 SQL Server CLR 실행이 실패함

이 문서는 SQL Server CLR 개체의 실행이 실패하고 System.TypeInitializationException 예외를 반환하는 문제를 해결하는 데 도움이 됩니다.

적용 대상: SQL Server
원래 KB 번호: 4576575

증상

중요

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

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

참조는 다음 예제를 참조하세요.

Msg 6522, Level 16, State 1, Procedure [your CLR object], Line 0 [Batch Start Line 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(Type type)에서
System.Data.TypeLimiter.Scope.IsAllowedType(Type type)에서
System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)의 System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter)에서
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)
에서 System.Data.XSDSchema.InstantiateTable(XmlSchemaElement 노드, XmlSchemaComplexType typeNode, Boolean isRef)
System.Data.XSDSchema.HandleTable(XmlSchemaElement 노드)에서
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)
에서 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에서...

해결 방법

이 문제는 2020년 10월 13일 .NET Framework 2020년 7월 Security-Only 업데이트 다시 게시할 때 해결되었습니다.

패치를 가져오는 방법을 포함하여 자세한 내용은 2020년 7월 보안 전용 업데이트 .NET Framework 다시 게시를 참조하세요.

해결 방법

경고

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

신뢰할 수 없는 XML 데이터를 또는 DataTable 개체의 instance 역직렬화하는 애플리케이션의 DataSet 경우 다른 방법을 사용하여 데이터에 액세스하는 것이 좋습니다. 신뢰할 수 있는 XML 데이터만 읽는 애플리케이션의 경우 다음 해결 방법 중 하나를 시도해 볼 수 있습니다.

참고

로컬로 변경되므로 해결 방법 1과 2를 사용하는 것이 좋습니다. 해결 방법 3은 시스템 전체입니다.

경고

이러한 해결 방법은 및 개체의 DataSetDataTable 인스턴스로 XML을 역직렬화하기 위한 형식 제한을 제거합니다. 애플리케이션이 신뢰할 수 없는 입력을 읽는 경우 보안 허점이 발생할 수 있습니다.

해결 방법 1: AppContext.SetSwitch 호출

SQL CLR 개체 코드의 시작을 변경하여 Switch.System.Data.AllowArbitraryDataSetTypeInstantiation 스위치를 true로 설정합니다. 적용 가능한 모든 SQL CLR 개체에 대해 이 작업을 수행해야 합니다. 아래 예제를 참고하십시오.

스크린샷은 SQL CLR 개체 코드 변경의 예를 보여줍니다.

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

해결 방법 2: 해당하는 각 instance 대한Sqlservr.exe.config 파일 만들기 또는 변경

이 해결 방법은 instance 자체에만 적용됩니다.

중요

이 변경 내용은 SQL Server 업데이트 또는 instance 업그레이드로 덮어쓰지 않도록 보장할 수 없습니다. instance 업데이트 또는 업그레이드 후에 변경 내용이 유지되는지 여부를 확인하는 것이 좋습니다.

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

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

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

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

    SQL Server 2016 instance 다음 예제를 참조하세요.

    스크린샷은 SQL Server 2016 instance 예를 보여줍니다.

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

GAC(전역 어셈블리 캐시)의 DLL 파일에서 SQL Server System.Drawing 어셈블리를 수동으로 만든 다음 또는 DataTable.ReadXML를 사용하는 DataSet.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 인스턴스를 다시 시작합니다.

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

    레지스트리 편집기 AppContext 레지스트리 키의 스크린샷

추가 정보

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