Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł pomaga obejść problem polegający na tym, że wykonywanie obiektów CLR programu SQL Server kończy się niepowodzeniem i zwraca wyjątek System.TypeInitializationException .
Dotyczy: SQL Server
Oryginalny numer KB: 4576575
Symptomy
Ważne
Ten artykuł zawiera informacje, które pokazują, jak ułatwić obniżenie ustawień zabezpieczeń lub jak wyłączyć funkcje zabezpieczeń na komputerze. Możesz wprowadzić te zmiany w celu obejścia określonego problemu. Przed wprowadzeniem tych zmian zalecamy ocenę ryzyka związanego z wdrożeniem tego obejścia w danym środowisku. Jeśli to obejście zostanie zaimplementowane, wykonaj odpowiednie dodatkowe kroki, aby ułatwić ochronę komputera.
Po zainstalowaniu odpowiedniej aktualizacji programu .NET Framework w celu naprawienia luki w zabezpieczeniach opisanej w artykule CVE-2020-1147 wykonanie funkcji Building Database Objects with Common Language Runtime (CLR) Integration that read XML into dataSet and DataTable security guidance objects fail (Wykonywanie kompilacji obiektów bazy danych za pomocą środowiska CLR) odczytującego kod XML do obiektów wskazówek dotyczących zabezpieczeń DataSet i DataTable kończy się niepowodzeniem. Dzieje się tak z powodu wyjątku System.TypeInitializationException , który ma zagnieżdżony wyjątek FileNotFoundException . Ten problem wskazuje, że nie można załadować zestawu System.Drawing .
Aby uzyskać informacje, zobacz następujący przykład:
Msg 6522, Level 16, State 1, Procedure [your CLR object], Line 0 [Batch Start Line 0] Wystąpił błąd programu .NET Framework podczas wykonywania procedury zdefiniowanej przez użytkownika lub agregacji "twój obiekt CLR":
System.TypeInitializationException: inicjator typu "Scope" zgłosił wyjątek. >--- System.IO.FileNotFoundException: Nie można załadować pliku ani zestawu "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=<Token>" lub jednej z jego zależności. W systemie nie można odnaleźć określonego pliku.
System.TypeInitializationException:
at System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(typ)
at System.Data.TypeLimiter.Scope.IsAllowedType(Typ)
at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type, TypeLimiter capturedLimiter) at System.Data.DataColumn.UpdateColumnType(Type, StorageType TypeCode)
w: 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, Wartość logiczna isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType TypeNode, Wartość logiczna 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, Wartość logiczna isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType TypeNode, Wartość logiczna 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)
w: System.Data.Data...
Rozwiązanie
Ten problem został rozwiązany w ponownej opublikowaniu programu .NET Framework z lipca 2020 r. w wersji 13 października 2020 r.
Aby uzyskać więcej informacji, w tym sposobu uzyskiwania poprawki, zobacz .NET Framework reubling of july 2020 Security Only Updates (Ponowne publikowanie programu .NET Framework z lipca 2020 r. w celu aktualizacji tylko zabezpieczeń).
Rozwiązanie
Ostrzeżenie
To obejście problemu może narazić komputer lub sieć na większe zagrożenie ze strony złośliwych użytkowników lub szkodliwego oprogramowania takiego jak wirusy. Nie zalecamy tego obejścia, ale udostępniamy te informacje, aby można było zaimplementować to obejście według własnego uznania. To obejście użytkownicy stosują na własną odpowiedzialność.
W przypadku aplikacji, które deserializuje niezaufane dane XML do wystąpienia obiektów DataSet lub DataTable , zalecamy użycie alternatywnej metody uzyskiwania dostępu do danych. W przypadku aplikacji, które odczytują tylko zaufane dane XML, możesz wypróbować jedno z następujących obejść.
Uwaga 16.
Preferowane są obejścia 1 i 2, ponieważ zmiany są wprowadzane lokalnie. Obejście 3 jest całego systemu.
Ostrzeżenie
Te obejścia powodują usunięcie ograniczeń typów w celu deserializacji kodu XML do wystąpień DataSet obiektów i DataTable . Może to spowodować otwarcie zabezpieczeń, jeśli aplikacja odczytuje niezaufane dane wejściowe.
Obejście 1. Wywołanie elementu AppContext.SetSwitch
Zmień początek kodu obiektu SQL CLR, aby ustawić przełącznik Switch.System.Data.AllowArbitraryDataSetTypeInstantiation na true. Należy to zrobić dla każdego odpowiedniego obiektu SQL CLR. Zobacz poniższy przykład.
Aby uzyskać więcej informacji, zobacz DataSet and DataTable security guidance (Wskazówki dotyczące zabezpieczeń zestawu danych i tabeli danych).
Obejście 2. Utwórz lub zmień plik Sqlservr.exe.config dla każdego odpowiedniego wystąpienia
To obejście dotyczy tylko samego wystąpienia.
Ważne
Nie możemy zagwarantować, że ta zmiana nie zostanie zastąpiona przez aktualizacje lub uaktualnienia wystąpień programu SQL Server. Zalecamy określenie, czy zmiana będzie się powtarzać po aktualizacji wystąpienia, czy uaktualnieniu.
Znajdź plik Sqlservr.exe.config w lokalizacjach plików dla domyślnych i nazwanych wystąpień programu SQL Server:
%ProgramFiles%\Microsoft SQL Server\<Instance_ID>.<Instance Name>\MSSQL\Binn\W węźle
<runtime>, ale poza wszystkimi węzłami zagnieżdżonym dodaj następujący wiersz:<AppContextSwitchOverrides value="Switch.System.Data. AllowArbitraryDataSetTypeInstantiation=true"/>Zapisz plik i uruchom ponownie wystąpienie.
Zobacz poniższy przykład wystąpienia programu SQL Server 2016.
Obejście 3. Tworzenie zestawu System.Drawing
Ręcznie utwórz zestaw System.Drawing w programie SQL Server z pliku DLL w globalnej pamięci podręcznej zestawów (GAC), a następnie utwórz ponownie zestawy, które używają DataSet.ReadXML elementu lub DataTable.ReadXML. Na przykład:
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
Obejście 4. Tworzenie podklucza rejestru
Ważne
Wykonaj kroki opisane w tym obejściem ostrożnie. Niepoprawne zmodyfikowanie rejestru może być przyczyną poważnych problemów. Przed zmodyfikowaniem rejestru należy utworzyć jego kopię zapasową, aby móc przywrócić rejestr na wypadek problemów.
To obejście będzie miało wpływ na wszystkie aplikacje platformy .NET na serwerze. W związku z tym należy użyć tej metody tylko w ostateczności, jeśli nie można użyć innych obejść.
Uruchom Edytor rejestru.
Odszukaj następujący podklucz rejestru:
KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContextREG_SZUtwórz wartość w następujący sposób.Nazwisko Switch.System.Data.AllowArbitraryDataSetTypeInstantiation Wartość prawda Uruchom ponownie wszystkie wystąpienia programu SQL Server.
Zobacz poniższy przykład.
Więcej informacji
Ten problem jest spowodowany działaniem najnowszej aktualizacji zabezpieczeń programu .NET Framework w celu skorygowania weryfikacji znaczników zawartości XML programu .NET Framework. Nie będzie to miało wpływu na obiekty CLR programu SQL Server, które nie odczytują kodu XML do wystąpień DataSet obiektów lub DataTable obiektów.