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

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 ermöglicht Entwicklern, sicherere .NET Framework-Bibliotheken zu schreiben, die Funktionalität für teilweise vertrauenswürdigen Code verfügbar machen.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. Transparenz der Ebene 1 wurde in .NET Framework, Version 2.0, eingeführt und wurde hauptsächlich bei Microsoft verwendet.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. Ab .NET Framework 4 können Sie Transparenz der Ebene 2verwenden.Starting with the .NET Framework 4, you can use level 2 transparency. Allerdings wurde Transparenz der Ebene 1 beibehalten, damit Legacycode identifiziert werden kann, der mit den früheren Sicherheitsregeln ausgeführt werden muss.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Wichtig

Geben Sie Transparenz der Ebene 1 nur aus Kompatibilitätsgründen an, d. h., geben Sie Ebene 1 nur für Code an, der mit .NET Framework 3.5 oder niedriger entwickelt wurde und für den AllowPartiallyTrustedCallersAttribute verwendet bzw. für den das Transparenzmodell nicht verwendet wird.You should specify level 1 transparency for compatibility only; that is, specify level 1 only for code that was developed with the .NET Framework 3.5 or earlier that uses the AllowPartiallyTrustedCallersAttribute or does not use the transparency model. Verwenden Sie Transparenz der Ebene 1 z. B. für .NET Framework 2.0-Assemblys, die Aufrufe von teilweise vertrauenswürdigen Aufrufern (APTCA) ermöglichen.For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). Verwenden Sie für Code, der für die .NET Framework 4 entwickelt wurde, immer Transparenz der Ebene 2.For code that is developed for the .NET Framework 4, always use level 2 transparency.

Dieses Thema enthält folgende Abschnitte:This topic contains the following sections:

Das Transparenzmodell der Ebene 1The Level 1 Transparency Model

Wenn Sie Transparenz der Ebene 1 verwenden, nutzen Sie ein Sicherheitsmodell, das Code in sicherheitstransparente, sicherheitsgeschützte und sicherheitskritische Methoden unterteilt.When you use Level 1 transparency, you are using a security model that separates code into security-transparent, security-safe-critical, and security-critical methods.

Sie können eine gesamte Assembly, einige Klassen in einer Assembly oder einige Methoden in einer Klasse als sicherheitstransparent kennzeichnen.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. Sicherheitstransparenter Code kann keine Berechtigungen heraufstufen.Security-transparent code cannot elevate privileges. Diese Einschränkung hat drei Konsequenzen:This restriction has three consequences:

  • Sicherheitstransparenter Code kann keine Assert-Aktionen durchführen.Security-transparent code cannot perform Assert actions.

  • Jeder Linkaufruf, der von sicherheitstransparentem Code umgesetzt wird, wird zu einem vollständigen Aufruf.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Jeder unsichere (nicht überprüfbare) Code, der in sicherheitstransparentem Code ausgeführt werden muss, verursacht einen vollständigen Aufruf der Sicherheitsberechtigung UnmanagedCode.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Diese Regeln werden während der Ausführung durch die Common Language Runtime (CLR) erzwungen.These rules are enforced during execution by the common language runtime (CLR). Sicherheitstransparenter Code übergibt alle Sicherheitsanforderungen des Codes zurück an seine Aufrufer.Security-transparent code passes all the security requirements of the code it calls back to its callers. Anforderungen, die durch sicherheitstransparenten Code fließen, können keine Berechtigungen heraufstufen.Demands that flow through the security-transparent code cannot elevate privileges. Wenn eine wenig vertrauenswürdige Anwendung sicherheitstransparenten Code aufruft und eine Anforderung für eine höhere Berechtigung verursacht, fließt die Anforderung zurück zum wenig vertrauenswürdigem Code und kann nicht ausgeführt werden.If a low-trust application calls security-transparent code and causes a demand for high privilege, the demand will flow back to the low-trust code and fail. Der sicherheitstransparente Code kann die Anforderung nicht aufhalten, da er keine Assert-Aktionen ausführen kann.The security-transparent code cannot stop the demand because it cannot perform assert actions. Wenn derselbe sicherheitstransparente Code von voll vertrauenswürdigem Code aufgerufen wird, kann die Anforderung erfolgreich ausgeführt werden.The same security-transparent code called from full-trust code results in a successful demand.

Sicherheitskritisch ist das Gegenteil von sicherheitstransparent.Security-critical is the opposite of security-transparent. Sicherheitskritischer Code wird mit voller Vertrauenswürdigkeit ausgeführt und kann alle privilegierten Vorgänge ausführen.Security-critical code executes with full trust and can perform all privileged operations. Sicherheitsgeschützter Code ist privilegierter Code, an dem eine umfassende Sicherheitsüberwachung durchgeführt wurde, um sicherzustellen, dass er teilweise vertrauenswürdigen Aufrufern nicht gestattet, Ressourcen zu verwenden, für die sie keine Zugriffsberechtigung haben.Security-safe-critical code is privileged code that has been through an extensive security audit to confirm that it does not allow partially trusted callers to use resources they do not have permission to access.

Sie müssen Transparenz explizit anwenden.You have to apply transparency explicitly. Der Großteil des Codes, der die Datenbearbeitung und Logik behandelt, kann in der Regel als sicherheitstransparent markiert werden, wohingegen die geringere Menge an Code, die Berechtigungen heraufstuft, als sicherheitskritisch oder sicherheitsgeschützt markiert wird.The majority of your code that handles data manipulation and logic can typically be marked as security-transparent, whereas the lesser amount of code that performs elevations of privileges is marked as security-critical or security-safe-critical.

Wichtig

Transparenz der Ebene 1 gilt nur für den Assemblybereich und wird nicht zwischen Assemblys erzwungen.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. Transparenz der Ebene 1 wurde hauptsächlich bei Microsoft für Sicherheitsüberwachungszwecke verwendet.Level 1 transparency was primarily used within Microsoft for security audit purposes. Sicherheitstransparenter Code in einer Assembly kann auf sicherheitskritische Typen und Member in einer Assembly der Ebene 1 zugreifen.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. Es ist wichtig, dass Sie Linkaufrufe für volle Vertrauenswürdigkeit in allen sicherheitskritischen Typen und Membern der Ebene 1 ausführen.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. Sicherheitsgeschützte Typen und Member müssen auch bestätigen, dass Aufrufer über Berechtigungen für geschützte Ressourcen verfügen, auf die der Typ oder Member zugreift.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

Für die Abwärtskompatibilität mit früheren Versionen von .NET Framework gelten alle Member, die nicht durch Transparenzattribute gekennzeichnet sind, als sicherheitsgeschützt.For backward compatibility with earlier versions of the .NET Framework, all members that are not annotated with transparency attributes are considered to be security-safe-critical. Alle Typen, die nicht mit einer Anmerkung versehen sind, werden als transparent betrachtet.All types that are not annotated are considered to be transparent. Es gibt keine statischen Analyseregeln für die Überprüfung der Transparenz.There are no static analysis rules to validate transparency. Daher müssen Sie Transparenzfehler gegebenenfalls zur Laufzeit debuggen.Therefore, you may need to debug transparency errors at run time.

TransparenzattributeTransparency Attributes

Die folgende Tabelle beschreibt die drei Attribute, die Sie verwenden, um den Code mit Anmerkungen für die Transparenz zu versehen.The following table describes the three attributes that you use to annotate your code for transparency.

attributeAttribute BESCHREIBUNGDescription
SecurityTransparentAttribute Nur auf Assemblyebene zulässig.Allowed only at the assembly level. Identifiziert alle Typen und Member in der Assembly als sicherheitstransparent.Identifies all types and members in the assembly as security-transparent. Die Assembly kann keinen sicherheitskritischen Code enthalten.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute Bei Verwendung auf Assemblyebene ohne die Scope-Eigenschaft wird der gesamte Code in der Assembly standardmäßig als sicherheitstransparent identifiziert, aber es wird angegeben, dass die Assembly sicherheitskritischen Code enthalten kann.When used at the assembly level without the Scope property, identifies all code in the assembly as security-transparent by default, but indicates that the assembly may contain security-critical code.

Bei Verwendung auf Klassenebene wird die Klasse oder Methode als sicherheitskritisch identifiziert, jedoch nicht die Member der Klasse.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Um alle Member als sicherheitskritisch festzulegen, setzen Sie die Scope-Eigenschaft auf Everything.To make all the members security-critical, set the Scope property to Everything.

Bei Verwendung auf Memberebene wird das Attribut nur auf diesen Member angewendet.When used at the member level, the attribute applies only to that member.

Die als sicherheitskritisch identifizierten Klassen oder Member können Berechtigungen heraufstufen.The class or member identified as security-critical can perform elevations of privilege. Wichtig: In Transparenz der Ebene 1 werden sicherheitskritische Typen und Member als Sicherheits geschützt behandelt, wenn Sie von außerhalb der Assembly aufgerufen werden.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the assembly. Sie sollten sicherheitskritische Typen und Member mit einem Linkaufruf schützen, um eine nicht autorisierte Heraufstufung der Berechtigungen zu schützen.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Identifiziert sicherheitskritischen Code, auf den von sicherheitstransparentem Code in der Assembly zugegriffen werden kann.Identifies security-critical code that can be accessed by security-transparent code in the assembly. Andernfalls kann sicherheitstransparenter Code nicht auf private oder interne sicherheitskritische Member in derselben Assembly zugreifen.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Wenn dies möglich wäre, würde sicherheitskritischer Code beeinflusst, und unerwartete Heraufstufungen von Berechtigungen wären möglich.Doing so would influence security-critical code and make unexpected elevations of privilege possible. Sicherheitsgeschützter Code sollte einer strengen Sicherheitsüberprüfung unterzogen werden.Security-safe-critical code should undergo a rigorous security audit. Hinweis: Sicherheits geschützte Typen und Member müssen die Berechtigungen von Aufrufern validieren, um zu bestimmen, ob der Aufrufer über Berechtigungen für den Zugriff auf geschützte Ressourcen verfügt.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

Das SecuritySafeCriticalAttribute-Attribut ermöglicht sicherheitstransparentem Code den Zugriff auf sicherheitskritische Member in derselben Assembly.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Der sicherheitstransparente und der sicherheitskritische Code in Ihrer Assembly ist gewissermaßen in zwei Assemblys unterteilt.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. Der sicherheitstransparente Code kann die privaten oder internen Member des sicherheitskritischen Codes nicht sehen.The security-transparent code would not be able to see the private or internal members of the security-critical code. Darüber hinaus wird der sicherheitskritische Code im Allgemeinen hinsichtlich des Zugriffs auf seine öffentliche Schnittstelle überwacht.Additionally, the security-critical code is generally audited for access to its public interface. Auf einen privaten oder internen Status sollte außerhalb der Assembly nicht zugegriffen werden können. Diese Status sollten isoliert bleiben.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. Das SecuritySafeCriticalAttribute-Attribut hält die Isolation des Status zwischen sicherheitstransparentem und sicherheitskritischem Code aufrecht, aber bietet die Möglichkeit, die Isolation bei Bedarf zu überschreiben.The SecuritySafeCriticalAttribute attribute maintains the isolation of state between security-transparent and security-critical code while providing the ability to override the isolation when it is necessary. Sicherheitstransparenter Code kann nicht auf privaten oder internen sicherheitskritischen Code zugreifen, es sei denn, die entsprechenden Member wurden mit SecuritySafeCriticalAttribute markiert.Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Vor dem Anwenden des SecuritySafeCriticalAttribute überwachen Sie den Member, als ob er öffentlich verfügbar wäre.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Assemblyweite AnmerkungAssembly-wide Annotation

Die folgende Tabelle beschreibt die Auswirkungen der Verwendung von Sicherheitsattributen auf Assemblyebene.The following table describes the effects of using security attributes at the assembly level.

Assembly-AttributAssembly attribute AssemblyzustandAssembly state
Kein Attribut in einer teilweise vertrauenswürdigen AssemblyNo attribute on a partially trusted assembly Alle Typen und Member sind transparent.All types and members are transparent.
Kein Attribut in einer voll vertrauenswürdigen Assembly (im globalen Assemblycache oder als voll vertrauenswürdig in der AppDomain identifiziert)No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Alle Typen sind transparent, und alle Member sind sicherheitskritisch und sicherheitsgeschützt.All types are transparent and all members are security-safe-critical.
SecurityTransparent Alle Typen und Member sind transparent.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Alle Typen und Member sind sicherheitskritisch.All types and members are security-critical.
SecurityCritical 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.

Beispiele für SicherheitstransparenzSecurity Transparency Examples

Verwenden Sie die folgende Assemblyanmerkung für die Verwendung die .NET Framework 2.0-Transparenzregeln (Transparenz der Ebene 1):To use the .NET Framework 2.0 transparency rules (level 1 transparency), use the following assembly annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Wenn Sie eine gesamte Assembly als transparent kennzeichnen möchten, um anzugeben, dass die Assembly keinen kritischen Code enthält und keine Berechtigungen heraufstuft, können Sie der Assembly mit dem folgenden Attribut explizit Transparenz hinzufügen:If you want to make a whole assembly transparent to indicate that the assembly does not contain any critical code and does not elevate privileges in any way, you can explicitly add transparency to the assembly with the following attribute:

[assembly: SecurityTransparent]  

Wenn Sie kritischen und sicherheitstransparenten Code in derselben Assembly verwenden möchten, markieren Sie die Assembly zunächst wie folgt mit dem SecurityCriticalAttribute-Attribut, um anzugeben, dass die Assembly kritischen Code enthalten kann:If you want to mix critical and transparent code in the same assembly, start by marking the assembly with the SecurityCriticalAttribute attribute to indicate that the assembly can contain critical code, as follows:

[assembly: SecurityCritical]  

Wenn Sie sicherheitskritische Aktionen durchführen möchten, müssen Sie den Code, der die kritische Aktion durchführen wird, explizit mit einem weiteren SecurityCriticalAttribute-Attribut kennzeichnen, wie im folgenden Codebeispiel dargestellt:If you want to perform security-critical actions, you must explicitly mark the code that will perform the critical action with another SecurityCriticalAttribute attribute, as shown in the following code example:

[assembly: SecurityCritical]  
public class A  
{  
    [SecurityCritical]  
    private void Critical()  
    {  
        // critical  
    }  
  
    public int SomeProperty  
    {  
        get {/* transparent */ }  
        set {/* transparent */ }  
    }  
}  
public class B  
{
    internal string SomeOtherProperty  
    {  
        get { /* transparent */ }  
        set { /* transparent */ }  
    }  
}  

Der vorhergehende Code ist transparent, mit Ausnahme der Critical-Methode, die explizit als sicherheitskritisch markiert ist.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. Transparenz ist die Standardeinstellung, selbst mit dem auf Assemblyebene zugewiesenen SecurityCriticalAttribute-Attribut.Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

Siehe auchSee also