Sicherheitstransparenter Code, Ebene 2Security-Transparent Code, Level 2

Achtung

Code Zugriffssicherheit (Code Access Security, CAS) und teilweise vertrauenswürdiger CodeCode Access Security (CAS) and Partially Trusted Code

.NET Framework bietet einen Mechanismus namens Codezugriffssicherheit (Code Access Security, CAS) zur Erzwingung verschiedener Vertrauensebenen für anderen Code, der in der gleichen Anwendung ausgeführt wird.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).

CAS wird in .net Core, .net 5 oder höheren Versionen nicht unterstützt. CAS werden von Versionen von c# höher als 7,0 nicht unterstützt.CAS is not supported in .NET Core, .NET 5, or later versions. CAS is not supported by versions of C# later than 7.0.

CAS in .NET Framework sollten nicht als Mechanismus zum Erzwingen von Sicherheitsgrenzen auf der Grundlage von Code Ursprungs oder anderen Identitäts Aspekten verwendet werden.CAS in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. CAS und Security-Transparent Code werden nicht als Sicherheits Begrenzung mit teilweise vertrauenswürdigem Code unterstützt, insbesondere bei Code mit unbekannter Herkunft.CAS and Security-Transparent Code are not supported as a security boundary with partially trusted code, especially code of unknown origin. Wir raten davon ab, Code unbekannter Herkunft zu laden und auszuführen, ohne alternative Sicherheitsmaßnahmen zu treffen.We advise against loading and executing code of unknown origins without putting alternative security measures in place. .NET Framework gibt keine Sicherheitspatches für Exploits mit Rechte Erweiterungen aus, die möglicherweise für den CAS-Sandkasten erkannt werden..NET Framework will not issue security patches for any elevation-of-privilege exploits that might be discovered against the CAS sandbox.

Diese Richtlinie gilt für alle Versionen von .NET Framework, außer für die in Silverlight enthaltene .NET Framework-Version.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Transparenz der Ebene 2 wurde in der .NET Framework 4 eingeführt.Level 2 transparency was introduced in the .NET Framework 4. Die drei Grundsätze dieses Modells sind transparenter Code, sicherheitsgeschützter Code und sicherheitskritischer Code.The three tenets of this model are transparent code, security-safe-critical code, and security-critical code.

  • Transparenter Code, einschließlich Code, der mit voller Vertrauenswürdigkeit ausgeführt wird, kann anderen transparenten Code oder sicherheitsgeschützten Code nur aufrufen.Transparent code, including code that is running as full trust, can call other transparent code or security-safe-critical code only. Er kann nur Aktionen durchführen, die von der domänenspezifischen Berechtigungseinstellung für teilweise Vertrauenswürdigkeit zugelassen werden.It can only perform actions allowed by the domain’s partial trust permission set (if one exists). Transparenter Code ist nicht für die folgenden Vorgänge vorgesehen:Transparent code cannot do the following:

    • Ausführen eines Assert-Vorgangs oder einer Berechtigungserweiterung.Perform an Assert or elevation of privilege.

    • Der Code darf keinen unsicheren oder nicht überprüfbaren Code enthalten.Contain unsafe or unverifiable code.

    • Direktes Aufrufen von wichtigem Code.Directly call critical code.

    • Aufrufen von systemeigenen Code oder von Code mit dem SuppressUnmanagedCodeSecurityAttribute-Attribut.Call native code or code with the SuppressUnmanagedCodeSecurityAttribute attribute.

    • Aufrufen eines Members, der von einem LinkDemand-Feld geschützt wird.Call a member that is protected by a LinkDemand.

    • Erben von wichtigen Typen.Inherit from critical types.

    Außerdem können transparente Methoden keine wichtigen virtuellen Methoden überschreiben oder wichtige Schnittstellenmethoden implementieren.In addition, transparent methods cannot override critical virtual methods or implement critical interface methods.

  • Sicherheitsgeschützter Code ist vollständig vertrauenswürdig, kann aber durch transparenten Code aufgerufen werden.Safe-critical code is fully trusted but is callable by transparent code. Er macht einen beschränkten Oberflächenbereich mit vollständig vertrauenswürdigem Code verfügbar. Korrektheits- und Sicherheitsüberprüfungen werden in sicherheitsgeschütztem Code ausgeführt.It exposes a limited surface area of full-trust code; correctness and security verifications happen in safe-critical code.

  • Mit sicherheitskritischem Code kann jeder Code aufgerufen werden, und er ist vollständig vertrauenswürdig, kann jedoch nicht von transparentem Code aufgerufen werden.Security-critical code can call any code and is fully trusted, but it cannot be called by transparent code.

Verwendungsbeispiele und VerhaltenUsage Examples and Behaviors

Verwenden Sie zum Angeben von .NET Framework 4-Regeln (Transparenz der Ebene 2) die folgende Anmerkung für eine Assembly:To specify .NET Framework 4 rules (level 2 transparency), use the following annotation for an assembly:

[assembly: SecurityRules(SecurityRuleSet.Level2)]

Um die .NET Framework 2.0-Regeln (Transparenz der Ebene 1) festzulegen, verwenden Sie die folgende Anmerkung:To lock into the .NET Framework 2.0 rules (level 1 transparency), use the following annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Wenn Sie keine Assembly mit Anmerkungen versehen, werden standardmäßig die .NET Framework 4-Regeln verwendet.If you do not annotate an assembly, the .NET Framework 4 rules are used by default. Es wird jedoch empfohlen, das- SecurityRulesAttribute Attribut anstelle der Standardeinstellung zu verwenden.However, the recommended best practice is to use the SecurityRulesAttribute attribute instead of depending on the default.

Assemblyweite AnmerkungAssembly-wide Annotation

Die folgenden Regeln gelten für die Verwendung von Attributen auf Assemblyebene:The following rules apply to the use of attributes at the assembly level:

  • Keine Attribute: Wenn Sie keine Attribute angeben, interpretiert die Laufzeit den gesamten Code als sicherheitskritisch, es sei denn, die Einstufung als sicherheitskritisch verletzt eine Vererbungsregel (z. B. beim Überschreiben oder Implementieren einer transparenten virtuellen oder Schnittstellenmethode).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). In diesen Fällen sind die Methoden sicherheitsgeschützt.In those cases, the methods are safe-critical. Wenn kein Attribut angegeben wird, bestimmt die Common Language Runtime die Transparenzregeln.Specifying no attribute causes the common language runtime to determine the transparency rules for you.

  • SecurityTransparent: Der gesamte Code ist transparent, und die gesamte Assembly führt keine privilegierten oder unsicheren Aktionen durch.SecurityTransparent: All code is transparent; the entire assembly will not do anything privileged or unsafe.

  • SecurityCritical: Der gesamte Code, der von Typen in dieser Assembly eingeführt wird, ist wichtig, und der gesamte andere Code ist transparent.SecurityCritical: All code that is introduced by types in this assembly is critical; all other code is transparent. Dieses Szenario ähnelt dem Fall, dass keine Attribute angegeben werden, allerdings werden die Transparenzregeln nicht automatisch von der Common Language Runtime bestimmt.This scenario is similar to not specifying any attributes; however, the common language runtime does not automatically determine the transparency rules. Wenn Sie beispielsweise eine virtuelle oder abstrakte Methode überschreiben oder eine Schnittstellenmethode implementieren, ist diese Methode standardmäßig transparent.For example, if you override a virtual or abstract method or implement an interface method, by default, that method is transparent. Sie müssen die Methode explizit als SecurityCritical oder SecuritySafeCritical kommentieren, andernfalls wird zur Ladezeit eine TypeLoadException ausgelöst.You must explicitly annotate the method as SecurityCritical or SecuritySafeCritical; otherwise, a TypeLoadException will be thrown at load time. Diese Regel gilt auch, wenn die Basisklasse und die abgeleitete Klasse sich in der gleichen Assembly befinden.This rule also applies when both the base class and the derived class are in the same assembly.

  • AllowPartiallyTrustedCallers (nur Ebene 2): Der gesamte Code ist standardmäßig transparent.AllowPartiallyTrustedCallers (level 2 only): All code defaults to transparent. Einzelne Typen und Member können jedoch andere Attribute haben.However, individual types and members can have other attributes.

In der folgenden Tabelle wird das Verhalten auf Assemblyebene für Ebene 2 mit Ebene 1 verglichen.The following table compares the assembly level behavior for Level 2 with Level 1.

Assembly-AttributAssembly attribute Ebene 2Level 2 Ebene 1Level 1
Kein Attribut in einer teilweise vertrauenswürdigen AssemblyNo attribute on a partially trusted assembly Typen und Member sind standardmäßig transparent, aber können sicherheitskritisch oder sicherheitsgeschützt sein.Types and members are by default transparent, but can be security-critical or security-safe-critical. Alle Typen und Member sind transparent.All types and members are transparent.
Kein AttributNo attribute Wenn kein Attribut angegeben wird, bestimmt die Common Language Runtime die Transparenzregeln.Specifying no attribute causes the common language runtime to determine the transparency rules for you. Alle Typen und Member sind sicherheitskritisch, es sei denn, die Einstufung als sicherheitskritisch verletzt eine Vererbungsregel.All types and members are security-critical, except where being security-critical violates an inheritance rule. In einer voll vertrauenswürdigen Assembly (im globalen Assemblycache oder als voll vertrauenswürdig in der AppDomain identifiziert) sind alle Typen transparent, und alle Member sind sicherheitsgeschützt.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 Alle Typen und Member sind transparent.All types and members are transparent. Alle Typen und Member sind transparent.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Nicht zutreffendNot applicable. Alle Typen und Member sind sicherheitskritisch.All types and members are security-critical.
SecurityCritical Der gesamte Code, der von Typen in dieser Assembly eingeführt wird, ist wichtig, und der gesamte andere Code ist transparent.All code that is introduced by types in this assembly is critical; all other code is transparent. Wenn Sie eine virtuelle oder abstrakte Methode überschreiben oder eine Schnittstellenmethode implementieren, müssen Sie diese Methode explizit per Anmerkung als SecurityCritical oder SecuritySafeCritical kennzeichnen.If you override a virtual or abstract method or implement an interface method, you must explicitly annotate the method as SecurityCritical or SecuritySafeCritical. Der gesamte Code ist standardmäßig transparent.All code defaults to transparent. Einzelne Typen und Member können jedoch andere Attribute haben.However, individual types and members can have other attributes.

Typ- und MemberanmerkungType and Member Annotation

Die Sicherheitsattribute, die auf einen Typ angewendet werden, gelten auch für die Elemente, die vom Typ eingeführt werden.The security attributes that are applied to a type also apply to the members that are introduced by the type. Allerdings gelten sie nicht für virtuelle oder abstrakte Überschreibungen der Basisklassen- oder Schnittstellenimplementierungen.However, they do not apply to virtual or abstract overrides of the base class or interface implementations. Die folgenden Regeln gelten für die Verwendung von Attributen auf Typ- und Memberebene:The following rules apply to the use of attributes at the type and member level:

  • SecurityCritical: Der Typ oder Member ist wichtig und kann nur von voll vertrauenswürdigem Code aufgerufen werden.SecurityCritical: The type or member is critical and can be called only by full-trust code. Methoden, die in einem sicherheitsrelevanten Typ eingeführt werden, sind wichtig.Methods that are introduced in a security-critical type are critical.

    Wichtig

    Virtuelle und abstrakte Methoden, die in Basisklassen oder Schnittstellen eingeführt und überschrieben oder in einer sicherheitskritischen Klasse implementiert werden, sind standardmäßig transparent.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. Sie müssen als SecuritySafeCritical oder SecurityCritical identifiziert werden.They must be identified as either SecuritySafeCritical or SecurityCritical.

  • SecuritySafeCritical: Der Typ oder Member ist sicherheitsgeschützt.SecuritySafeCritical: The type or member is safe-critical. Allerdings kann der Typ oder Member von transparentem (teilweise vertrauenswürdigem) Code aufgerufen werden und ist so leistungsfähig wie jeder andere wichtige Code.However, the type or member can be called from transparent (partially trusted) code and is as capable as any other critical code. Der Code muss hinsichtlich der Sicherheit überwacht werden.The code must be audited for security.

ÜberschreibungsmusterOverride Patterns

In der folgenden Tabelle werden die für die Transparenz der Ebene 2 zulässigen Methodenüberschreibungen aufgeführt.The following table shows the method overrides allowed for level 2 transparency.

Basis virtuell/SchnittstellenmemberBase virtual/interface member Überschreiben/SchnittstelleOverride/interface
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

VererbungsregelnInheritance Rules

In diesem Abschnitt wird Transparent, Critical und SafeCritical Code basierend auf Zugriff und Funktionalität folgende Reihenfolge zugewiesen:In this section, the following order is assigned to Transparent, Critical, and SafeCritical code based on access and capabilities:

Transparent < SafeCritical < Critical

  • Regeln für Typen: Von links nach rechts wird der Zugriff immer stärker eingeschränkt.Rules for types: Going from left to right, access becomes more restrictive. Abgeleitete Typen müssen mindestens so restriktiv wie der Basistyp sein.Derived types must be at least as restrictive as the base type.

  • Regeln für Methoden: Der Zugriff abgeleiteter Methoden kann nicht vom Zugriff der Basismethode abweichen.Rules for methods: Derived methods cannot change accessibility from the base method. Standardmäßig sind alle abgeleiteten Methoden, die nicht mit einer Anmerkung versehen sind, Transparent.For default behavior, all derived methods that are not annotated are Transparent. Ableitungen wichtiger Typen bewirken, dass eine Ausnahme ausgelöst wird, wenn die überschriebene Methode nicht explizit als SecurityCritical gekennzeichnet ist.Derivatives of critical types cause an exception to be thrown if the overridden method is not explicitly annotated as SecurityCritical.

In der folgenden Tabelle werden die zulässigen Muster der Typenvererbung aufgeführt.The following table shows the allowed type inheritance patterns.

BasisklasseBase class Abgeleitete Klasse kann Folgendes sein:Derived class can be
Transparent Transparent
Transparent SafeCritical
Transparent Critical
SafeCritical SafeCritical
SafeCritical Critical
Critical Critical

In der folgenden Tabelle werden die unzulässigen Muster der Typenvererbung aufgeführt.The following table shows the disallowed type inheritance patterns.

BasisklasseBase class Abgeleitete Klasse kann Folgendes nicht sein:Derived class cannot be
SafeCritical Transparent
Critical Transparent
Critical SafeCritical

In der folgenden Tabelle werden die zulässigen Muster der Methodenvererbung aufgeführt.The following table shows the allowed method inheritance patterns.

BasismethodeBase method Abgeleitete Methode kann Folgendes sein:Derived method can be
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

In der folgenden Tabelle werden die unzulässigen Muster der Methodenvererbung aufgeführt.The following table shows the disallowed method inheritance patterns.

BasismethodeBase method Abgeleitete Methode kann Folgendes nicht sein:Derived method cannot be
Transparent Critical
SafeCritical Critical
Critical Transparent
Critical SafeCritical

Hinweis

Diese Vererbungsregeln gelten für Typen und Member der Ebene 2.These inheritance rules apply to level 2 types and members. Typen in Assemblys der Ebene 1 können von sicherheitskritischen Typen und Membern der Ebene 2 erben.Types in level 1 assemblies can inherit from level 2 security-critical types and members. Daher müssen Typen und Member der Ebene 2 separate Vererbungsanforderungen für Erben der Ebene 1 aufweisen.Therefore, level 2 types and members must have separate inheritance demands for level 1 inheritors.

Zusätzliche Informationen und RegelnAdditional Information and Rules

LinkDemand-UnterstützungLinkDemand Support

Das Transparenzmodell der Ebene 2 ersetzt LinkDemand durch das SecurityCriticalAttribute-Attribut.The level 2 transparency model replaces the LinkDemand with the SecurityCriticalAttribute attribute. In Legacycode (Stufe 1) wird ein LinkDemand automatisch als ein Demand behandelt.In legacy (level 1) code, a LinkDemand is automatically treated as a Demand.

SpiegelungReflection

Das Aufrufen einer wichtigen Methode oder das Lesen eines wichtigen Felds löst eine Anforderung vollständiger Vertrauenswürdigkeit aus (wie beim Aufrufen einer privaten Methode oder eines privaten Felds).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). Aus diesem Grund kann voll vertrauenswürdiger Code eine wichtige Methode aufrufen, teilweise vertrauenswürdiger Code hingegen nicht.Therefore, full-trust code can invoke a critical method, whereas partial-trust code cannot.

Die folgenden Eigenschaften wurden dem Namespace "System.Reflection" hinzugefügt, um zu bestimmen, ob der Typ, die Methode oder das Feld SecurityCritical, SecuritySafeCritical oder SecurityTransparent ist: IsSecurityCritical, IsSecuritySafeCritical und 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. Verwenden Sie diese Eigenschaften zur Bestimmung der Transparenz durch Reflektion statt durch Prüfen auf das Vorhandensein des Attributs.Use these properties to determine transparency by using reflection instead of checking for the presence of the attribute. Die Transparenzregeln sind komplex, und das Prüfen auf das Attribut ist möglicherweise nicht ausreichend.The transparency rules are complex, and checking for the attribute may not be sufficient.

Hinweis

Eine SafeCritical Methode gibt true sowohl für IsSecurityCritical als auch zurück IsSecuritySafeCritical , da SafeCritical tatsächlich kritisch ist (Sie hat die gleichen Funktionen wie kritischer Code, aber Sie kann aus transparentem Code aufgerufen werden).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).

Dynamische Methoden erben die Transparenz der Module, denen sie zugeordnet sind. Sie erben nicht die Transparenz des Typs (sofern sie einem Typ zugeordnet sind).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).

Überspringen der Überprüfung bei vollständiger VertrauenswürdigkeitSkip Verification in Full Trust

Sie können die Überprüfung für vollständig vertrauenswürdige transparente Assemblys überspringen, indem Sie die Eigenschaft "SkipVerificationInFullTrust" im Attribut "SecurityRulesAttribute" auf "true" festlegen: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)]

Die Eigenschaft "SkipVerificationInFullTrust" ist standardmäßig "false" und muss daher auf "true" festgelegt werden, um die Überprüfung zu überspringen.The SkipVerificationInFullTrust property is false by default, so the property must be set to true to skip verification. Dies sollte nur zu Optimierungszwecken erfolgen.This should be done for optimization purposes only. Stellen Sie sicher, dass der transparente Code in der Assembly überprüfbar ist. verwenden Sie dazu die transparent Option im Tool "Peer Verify".You should ensure that the transparent code in the assembly is verifiable by using the transparent option in the PEVerify tool.

Siehe auchSee also