Kod o przezroczystym poziomie bezpieczeństwa, poziom 2Security-Transparent Code, Level 2

Przestroga

Zabezpieczenia dostępu kodu (CAS) i częściowo zaufany kodCode Access Security (CAS) and Partially Trusted Code

Platforma .NET Framework zapewnia mechanizm wymuszania różnych poziomów zaufania dla różnego kodu uruchamianego w tej samej aplikacji nazywany zabezpieczeniami dostępu kodu (CAS, Code Access Security).The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS).

Urzędy certyfikacji nie są obsługiwane w wersjach .NET Core, .NET 5 i nowszych. Urzędy certyfikacji nie są obsługiwane w wersjach języka C# nowszych niż 7,0.CAS is not supported in .NET Core, .NET 5, or later versions. CAS is not supported by versions of C# later than 7.0.

Urzędów certyfikacji w .NET Framework nie należy używać jako mechanizmu wymuszania granic zabezpieczeń na podstawie pochodzenia kodu lub innych aspektów tożsamości.CAS in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Urzędy certyfikacji i kod Security-Transparent nie są obsługiwane jako granice zabezpieczeń z częściowo zaufanym kodem, szczególnie kod nieznanego źródła.CAS and Security-Transparent Code are not supported as a security boundary with partially trusted code, especially code of unknown origin. Odradzamy ładowanie i wykonywanie kodu z nieznanego źródła bez zapewnienia alternatywnych środków bezpieczeństwa.We advise against loading and executing code of unknown origins without putting alternative security measures in place. .NET Framework nie będzie wystawiał poprawek zabezpieczeń dla wszystkich luk w zabezpieczeniach, które mogą zostać odnalezione w piaskownicy urzędów certyfikacji..NET Framework will not issue security patches for any elevation-of-privilege exploits that might be discovered against the CAS sandbox.

Te zasady mają zastosowanie do wszystkich wersji platformy .NET Framework, ale nie mają zastosowania do platformy .NET Framework zawartej w technologii Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Poziom 2 przejrzystości został wprowadzony w .NET Framework 4.Level 2 transparency was introduced in the .NET Framework 4. Trzy założenia tego modelu to kod przezroczysty, kod zabezpieczeń bezpieczny-krytyczny i kod krytyczny dla bezpieczeństwa.The three tenets of this model are transparent code, security-safe-critical code, and security-critical code.

  • Kod przezroczysty, w tym kod, który jest uruchomiony jako pełne zaufanie, może wywoływać inny kod przezroczysty lub tylko kod krytyczny bezpieczeństwa.Transparent code, including code that is running as full trust, can call other transparent code or security-safe-critical code only. Może wykonywać tylko akcje dozwolone przez zestaw uprawnień częściowej relacji zaufania domeny (jeśli taki istnieje).It can only perform actions allowed by the domain’s partial trust permission set (if one exists). Kod przezroczysty nie może wykonać następujących czynności:Transparent code cannot do the following:

    • Wykonanie Assert lub podniesienie uprawnień.Perform an Assert or elevation of privilege.

    • Zawiera kod niebezpieczny lub niemożliwy do zweryfikowania.Contain unsafe or unverifiable code.

    • Bezpośrednie Wywoływanie kodu krytycznego.Directly call critical code.

    • Wywoływanie kodu natywnego lub kodu przy użyciu SuppressUnmanagedCodeSecurityAttribute atrybutu.Call native code or code with the SuppressUnmanagedCodeSecurityAttribute attribute.

    • Wywoływanie elementu członkowskiego, który jest chroniony przez LinkDemand .Call a member that is protected by a LinkDemand.

    • Dziedzicz z typów krytycznych.Inherit from critical types.

    Ponadto metody przezroczyste nie mogą przesłaniać krytycznych metod wirtualnych ani implementować metod interfejsu krytycznego.In addition, transparent methods cannot override critical virtual methods or implement critical interface methods.

  • Kod bezpieczny-krytyczny jest w pełni zaufany, ale jest wywoływany przez kod przezroczysty.Safe-critical code is fully trusted but is callable by transparent code. Ujawnia on ograniczony obszar, w którym znajduje się kod pełnego zaufania; Sprawdzanie poprawności i zabezpieczeń odbywa się w kodzie krytycznym.It exposes a limited surface area of full-trust code; correctness and security verifications happen in safe-critical code.

  • Kod krytyczny dla zabezpieczeń może wywołać dowolny kod i jest w pełni zaufany, ale nie może być wywoływany przez kod przezroczysty.Security-critical code can call any code and is fully trusted, but it cannot be called by transparent code.

Przykłady użycia i zachowaniaUsage Examples and Behaviors

Aby określić reguły .NET Framework 4 (poziom 2 przezroczystości), użyj następującej adnotacji dla zestawu:To specify .NET Framework 4 rules (level 2 transparency), use the following annotation for an assembly:

[assembly: SecurityRules(SecurityRuleSet.Level2)]

Aby zablokować reguły .NET Framework 2,0 (poziom 1 przejrzystości), użyj następującej adnotacji:To lock into the .NET Framework 2.0 rules (level 1 transparency), use the following annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Jeśli nie podasz adnotacji z zestawem, domyślnie używane są reguły .NET Framework 4.If you do not annotate an assembly, the .NET Framework 4 rules are used by default. Jednak zalecanym najlepszym rozwiązaniem jest użycie SecurityRulesAttribute atrybutu zamiast wartości domyślnej.However, the recommended best practice is to use the SecurityRulesAttribute attribute instead of depending on the default.

Adnotacja w całej zestawieAssembly-wide Annotation

Następujące reguły mają zastosowanie do korzystania z atrybutów na poziomie zestawu:The following rules apply to the use of attributes at the assembly level:

  • Brak atrybutów: Jeśli nie określisz żadnych atrybutów, środowisko uruchomieniowe interpretuje cały kod jako krytyczny dla zabezpieczeń, z wyjątkiem sytuacji, w których zabezpieczenia krytyczne naruszają regułę dziedziczenia (na przykład podczas zastępowania lub implementowania przezroczystej metody wirtualnej lub interfejsu).No attributes: If you do not specify any attributes, the runtime interprets all code as security-critical, except where being security-critical violates an inheritance rule (for example, when overriding or implementing a transparent virtual or interface method). W takich przypadkach metody są bezpieczne-krytyczne.In those cases, the methods are safe-critical. Określenie braku atrybutu powoduje, że środowisko uruchomieniowe języka wspólnego nie określi reguł przezroczystości.Specifying no attribute causes the common language runtime to determine the transparency rules for you.

  • SecurityTransparent: Cały kod jest przezroczysty; cały zestaw nie będzie miał żadnego uprzywilejowanego ani niebezpiecznego.SecurityTransparent: All code is transparent; the entire assembly will not do anything privileged or unsafe.

  • SecurityCritical: Cały kod wprowadzony przez typy w tym zestawie ma krytyczne znaczenie. cały inny kod jest przezroczysty.SecurityCritical: All code that is introduced by types in this assembly is critical; all other code is transparent. Ten scenariusz jest podobny do nieokreślania atrybutów; jednak środowisko uruchomieniowe języka wspólnego nie ustala automatycznie reguł przezroczystości.This scenario is similar to not specifying any attributes; however, the common language runtime does not automatically determine the transparency rules. Na przykład jeśli zastąpisz metodę wirtualną lub abstrakcyjną lub implementuje metodę interfejsu, domyślnie ta metoda jest przezroczysta.For example, if you override a virtual or abstract method or implement an interface method, by default, that method is transparent. Należy jawnie dodać adnotację do metody jako SecurityCritical lub SecuritySafeCritical ; w przeciwnym razie TypeLoadException zostanie wygenerowane w czasie ładowania.You must explicitly annotate the method as SecurityCritical or SecuritySafeCritical; otherwise, a TypeLoadException will be thrown at load time. Ta reguła ma zastosowanie również wtedy, gdy zarówno Klasa bazowa, jak i Klasa pochodna znajdują się w tym samym zestawie.This rule also applies when both the base class and the derived class are in the same assembly.

  • AllowPartiallyTrustedCallers (tylko poziom 2): wszystkie wartości domyślne kodu są przezroczyste.AllowPartiallyTrustedCallers (level 2 only): All code defaults to transparent. Jednak poszczególne typy i elementy członkowskie mogą mieć inne atrybuty.However, individual types and members can have other attributes.

Poniższa tabela zawiera porównanie zachowania poziomu zestawu dla poziomu 2 z poziomem 1.The following table compares the assembly level behavior for Level 2 with Level 1.

Atrybut zestawuAssembly attribute Poziom 2Level 2 Poziom 1Level 1
Brak atrybutu dla częściowo zaufanego zestawuNo attribute on a partially trusted assembly Typy i elementy członkowskie są domyślnie przezroczyste, ale mogą mieć zabezpieczenia krytyczne lub zabezpieczenia-krytyczne.Types and members are by default transparent, but can be security-critical or security-safe-critical. Wszystkie typy i elementy członkowskie są przezroczyste.All types and members are transparent.
Brak atrybutuNo attribute Określenie braku atrybutu powoduje, że środowisko uruchomieniowe języka wspólnego nie określi reguł przezroczystości.Specifying no attribute causes the common language runtime to determine the transparency rules for you. Wszystkie typy i elementy członkowskie mają krytyczne znaczenie dla zabezpieczeń, z wyjątkiem sytuacji, w których krytyczne zabezpieczenia naruszają regułę dziedziczenia.All types and members are security-critical, except where being security-critical violates an inheritance rule. W pełni zaufany zestaw (w globalnej pamięci podręcznej zestawów lub zidentyfikowane jako pełne zaufanie w AppDomain ) wszystkie typy są przezroczyste i wszystkie elementy członkowskie są bezpieczne-krytyczne.On a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) all types are transparent and all members are security-safe-critical.
SecurityTransparent Wszystkie typy i elementy członkowskie są przezroczyste.All types and members are transparent. Wszystkie typy i elementy członkowskie są przezroczyste.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Nie dotyczy.Not applicable. Wszystkie typy i elementy członkowskie są krytyczne dla zabezpieczeń.All types and members are security-critical.
SecurityCritical Cały kod, który jest wprowadzany przez typy w tym zestawie, ma krytyczne znaczenie. cały inny kod jest przezroczysty.All code that is introduced by types in this assembly is critical; all other code is transparent. Jeśli zastąpisz wirtualną lub abstrakcyjną metodę lub implementuje metodę interfejsu, należy jawnie dodać adnotację do metody jako SecurityCritical lub SecuritySafeCritical .If you override a virtual or abstract method or implement an interface method, you must explicitly annotate the method as SecurityCritical or SecuritySafeCritical. Wszystkie wartości domyślne kodu są przezroczyste.All code defaults to transparent. Jednak poszczególne typy i elementy członkowskie mogą mieć inne atrybuty.However, individual types and members can have other attributes.

Typ i adnotacja członkowskaType and Member Annotation

Atrybuty zabezpieczeń stosowane do typu mają również zastosowanie do elementów członkowskich, które są wprowadzane przez typ.The security attributes that are applied to a type also apply to the members that are introduced by the type. Jednak nie mają zastosowania do wirtualnych lub abstrakcyjnych zastąpień klasy bazowej lub implementacji interfejsów.However, they do not apply to virtual or abstract overrides of the base class or interface implementations. Następujące reguły mają zastosowanie do używania atrybutów na poziomie typu i elementu członkowskiego:The following rules apply to the use of attributes at the type and member level:

  • SecurityCritical: Typ lub element członkowski jest krytyczny i może być wywoływany tylko przez kod pełnego zaufania.SecurityCritical: The type or member is critical and can be called only by full-trust code. Metody wprowadzane w zabezpieczeniach typu krytycznego są krytyczne.Methods that are introduced in a security-critical type are critical.

    Ważne

    Metody wirtualne i abstrakcyjne wprowadzone w klasach bazowych lub interfejsach, a także zastąpione lub zaimplementowane w klasie o krytycznym znaczeniu są domyślnie przezroczyste.Virtual and abstract methods that are introduced in base classes or interfaces, and overridden or implemented in a security-critical class are transparent by default. Muszą one być zidentyfikowane jako SecuritySafeCritical lub SecurityCritical .They must be identified as either SecuritySafeCritical or SecurityCritical.

  • SecuritySafeCritical: Typ lub element członkowski jest bezpieczny-krytyczny.SecuritySafeCritical: The type or member is safe-critical. Jednak typ lub element członkowski może być wywoływany z przezroczystego (częściowo zaufanego) kodu i jest tak jak każdy inny kod krytyczny.However, the type or member can be called from transparent (partially trusted) code and is as capable as any other critical code. Kod musi być poddany inspekcji pod kątem bezpieczeństwa.The code must be audited for security.

Zastępowanie wzorówOverride Patterns

W poniższej tabeli przedstawiono metody przesłaniania dozwolone dla przezroczystości poziomu 2.The following table shows the method overrides allowed for level 2 transparency.

Podstawowy element członkowski wirtualnego/interfejsuBase virtual/interface member Zastąpienie/interfejsOverride/interface
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

Zasady dziedziczeniaInheritance Rules

W tej sekcji następująca kolejność jest przypisana do Transparent , Critical i SafeCritical kodu na podstawie dostępu i możliwości:In this section, the following order is assigned to Transparent, Critical, and SafeCritical code based on access and capabilities:

Transparent < SafeCritical < Critical

  • Reguły dla typów: od lewej do prawej, dostęp staną się bardziej restrykcyjne.Rules for types: Going from left to right, access becomes more restrictive. Typy pochodne muszą być co najmniej tak restrykcyjne jak typ podstawowy.Derived types must be at least as restrictive as the base type.

  • Reguły dla metod: metody pochodne nie mogą zmieniać dostępności z metody podstawowej.Rules for methods: Derived methods cannot change accessibility from the base method. W przypadku zachowania domyślnego wszystkie metody pochodne, które nie są adnotacjami, są Transparent .For default behavior, all derived methods that are not annotated are Transparent. Pochodne typów krytycznych powodują, że wyjątek jest zgłaszany, jeśli zastąpiona metoda nie jest jawnie oznaczona adnotacją SecurityCritical .Derivatives of critical types cause an exception to be thrown if the overridden method is not explicitly annotated as SecurityCritical.

W poniższej tabeli przedstawiono wzorce dziedziczenia typów dozwolonych.The following table shows the allowed type inheritance patterns.

Klasa bazowaBase class Klasa pochodna może byćDerived class can be
Transparent Transparent
Transparent SafeCritical
Transparent Critical
SafeCritical SafeCritical
SafeCritical Critical
Critical Critical

W poniższej tabeli przedstawiono wzorce dziedziczenia typu niedozwolone.The following table shows the disallowed type inheritance patterns.

Klasa bazowaBase class Klasa pochodna nie może byćDerived class cannot be
SafeCritical Transparent
Critical Transparent
Critical SafeCritical

W poniższej tabeli przedstawiono dozwolone wzorce dziedziczenia metody.The following table shows the allowed method inheritance patterns.

Metoda bazowaBase method Pochodna Metoda może byćDerived method can be
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

W poniższej tabeli przedstawiono niedozwolone wzorce dziedziczenia metody.The following table shows the disallowed method inheritance patterns.

Metoda bazowaBase method Metoda pochodna nie może byćDerived method cannot be
Transparent Critical
SafeCritical Critical
Critical Transparent
Critical SafeCritical

Uwaga

Te reguły dziedziczenia mają zastosowanie do typów i elementów członkowskich poziomu 2.These inheritance rules apply to level 2 types and members. Typy zestawów na poziomie 1 mogą dziedziczyć z typów i elementów krytycznych zabezpieczeń poziomu 2.Types in level 1 assemblies can inherit from level 2 security-critical types and members. W związku z tym typy i elementy członkowskie poziomu 2 muszą mieć oddzielne żądania dziedziczenia dla dziedziczeń poziomu 1.Therefore, level 2 types and members must have separate inheritance demands for level 1 inheritors.

Dodatkowe informacje i zasadyAdditional Information and Rules

Obsługa LinkDemandLinkDemand Support

Model przezroczystości poziomu 2 zastępuje LinkDemand SecurityCriticalAttribute atrybut i.The level 2 transparency model replaces the LinkDemand with the SecurityCriticalAttribute attribute. W starszej wersji (poziom 1) kod LinkDemand jest automatycznie traktowany jako Demand .In legacy (level 1) code, a LinkDemand is automatically treated as a Demand.

OdbicieReflection

Wywołanie krytycznej metody lub odczytanie pola krytycznego wyzwala żądanie pełnego zaufania (podobnie jak w przypadku wywołania metody prywatnej lub pola).Invoking a critical method or reading a critical field triggers a demand for full trust (just as if you were invoking a private method or field). W związku z tym kod pełnego zaufania może wywołać metodę krytyczną, natomiast kod częściowego zaufania nie może.Therefore, full-trust code can invoke a critical method, whereas partial-trust code cannot.

Do przestrzeni nazw dodano następujące właściwości, System.Reflection Aby określić, czy typ, metoda lub pole to SecurityCritical , SecuritySafeCritical , lub SecurityTransparent : IsSecurityCritical , IsSecuritySafeCritical , i IsSecurityTransparent .The following properties have been added to the System.Reflection namespace to determine whether the type, method, or field is SecurityCritical, SecuritySafeCritical, or SecurityTransparent: IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent. Te właściwości umożliwiają określanie przejrzystości przy użyciu odbicia zamiast sprawdzania obecności atrybutu.Use these properties to determine transparency by using reflection instead of checking for the presence of the attribute. Reguły przezroczystości są złożone i sprawdzanie, czy atrybut może być niewystarczający.The transparency rules are complex, and checking for the attribute may not be sufficient.

Uwaga

SafeCriticalMetoda zwraca true dla obu IsSecurityCritical i IsSecuritySafeCritical , ponieważ SafeCritical jest rzeczywiście krytyczne (ma takie same możliwości jak kod krytyczny, ale może być wywoływana z kodu przezroczystego).A SafeCritical method returns true for both IsSecurityCritical and IsSecuritySafeCritical, because SafeCritical is indeed critical (it has the same capabilities as critical code, but it can be called from transparent code).

Metody dynamiczne dziedziczą przezroczystości modułów, do których są dołączone; nie dziedziczą przezroczystości typu (jeśli są dołączone do typu).Dynamic methods inherit the transparency of the modules they are attached to; they do not inherit the transparency of the type (if they are attached to a type).

Pomiń weryfikację w trybie całkowitego zaufaniaSkip Verification in Full Trust

Możesz pominąć weryfikację dla w pełni zaufanych zestawów przezroczystych przez ustawienie SkipVerificationInFullTrust właściwości na true wartość w SecurityRulesAttribute atrybucie:You can skip verification for fully trusted transparent assemblies by setting the SkipVerificationInFullTrust property to true in the SecurityRulesAttribute attribute:

[assembly: SecurityRules(SecurityRuleSet.Level2, SkipVerificationInFullTrust = true)]

SkipVerificationInFullTrustWłaściwość jest false Domyślnie, więc właściwość musi być ustawiona na, aby true pominąć weryfikację.The SkipVerificationInFullTrust property is false by default, so the property must be set to true to skip verification. Należy to zrobić tylko w celach optymalizacji.This should be done for optimization purposes only. Upewnij się, że przezroczysty kod w zestawie jest możliwy do zweryfikowania przy użyciu transparent opcji w narzędziu PEVerify.You should ensure that the transparent code in the assembly is verifiable by using the transparent option in the PEVerify tool.

Zobacz takżeSee also