Transparentní kód pro zabezpečení, úroveň 1Security-Transparent Code, Level 1

Upozornění

Zabezpečení přístupu kódu (CAS) a částečně důvěryhodný kódCode Access Security (CAS) and Partially Trusted Code

Rozhraní .NET Framework poskytuje mechanismus pro vynucení různých úrovní důvěryhodnosti pro různý kód spuštěný ve stejné aplikaci, který se označuje jako zabezpečení přístupu kódu (CAS).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).

Certifikační autority nejsou podporované v .NET Core, .NET 5 a novějších verzích. Verze CAS nejsou podporované verzemi C#, které jsou novější než 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.

Certifikační autority v .NET Framework by se neměly používat jako mechanismus pro vynucování hranic zabezpečení na základě původu kódu nebo jiných aspektů identity.CAS in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. CAS a kód Security-Transparent nejsou podporovány jako hranice zabezpečení s částečně důvěryhodným kódem, zejména s kódem neznámého původu.CAS and Security-Transparent Code are not supported as a security boundary with partially trusted code, especially code of unknown origin. Kód neznámého původu nedoporučujeme načítat ani spouštět, pokud nejsou nastavená alternativní bezpečnostní opatření.We advise against loading and executing code of unknown origins without putting alternative security measures in place. .NET Framework nevydá opravy zabezpečení pro všechna zneužití oprávnění ke zvýšení oprávnění, která by mohla být zjištěna v izolovaném prostoru CAS..NET Framework will not issue security patches for any elevation-of-privilege exploits that might be discovered against the CAS sandbox.

Tyto zásady se vztahují na všechny verze rozhraní .NET Framework, ale nevztahují se na rozhraní .NET, které je součástí Silverlightu.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Transparentnost pomáhá vývojářům psát bezpečnější .NET Framework knihovny, které zpřístupňují funkce částečně důvěryhodnému kódu.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. Transparentnost první úrovně byla představena v .NET Framework verze 2,0 a byla primárně používána pouze v rámci společnosti Microsoft.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. Počínaje .NET Framework 4 můžete použít transparentnost úrovně 2.Starting with the .NET Framework 4, you can use level 2 transparency. Transparentnost první úrovně ale byla zachovaná, takže můžete identifikovat starší kód, který musí běžet s předchozími pravidly zabezpečení.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Důležité

Měli byste zadat transparentnost první úrovně pouze pro kompatibilitu; To znamená, že zadejte úroveň 1 pouze pro kód vyvinutý s .NET Framework 3,5 nebo starším, který používá AllowPartiallyTrustedCallersAttribute nebo nepoužívá model transparentnosti.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. Například použijte transparentnost první úrovně pro sestavení .NET Framework 2,0, která umožňují volání z částečně důvěryhodných volajících (APTCA).For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). Pro kód vyvinutý pro .NET Framework 4 vždy použijte transparentnost úrovně 2.For code that is developed for the .NET Framework 4, always use level 2 transparency.

Toto téma obsahuje následující oddíly:This topic contains the following sections:

Model transparentnosti úrovně 1The Level 1 Transparency Model

Pokud používáte transparentnost první úrovně, používáte model zabezpečení, který odděluje kód do bezpečnostních a transparentních metod, které jsou bezpečné pro zabezpečení a kritické pro zabezpečení.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.

Můžete označit celé sestavení, některé třídy v sestavení nebo některé metody ve třídě jako transparentní pro zabezpečení.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. Kód transparentní pro zabezpečení nemůže zvýšit oprávnění.Security-transparent code cannot elevate privileges. Toto omezení má tři důsledky:This restriction has three consequences:

  • Kód transparentní pro zabezpečení nemůže provádět Assert akce.Security-transparent code cannot perform Assert actions.

  • Všechny požadavky propojení, které by byly splněny kódem transparentním z bezpečnostních potřeb, se stávají úplnými požadavky.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Jakýkoli nezabezpečený (neověřitelný) kód, který musí být spuštěn v kódu transparentním z bezpečnostních důvodů, způsobuje plný požadavek na UnmanagedCode oprávnění zabezpečení.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Tato pravidla jsou vynutila během provádění modulem CLR (Common Language Runtime).These rules are enforced during execution by the common language runtime (CLR). Kód transparentní pro zabezpečení předává všechny požadavky na zabezpečení kódu, který volá zpět na jeho volající.Security-transparent code passes all the security requirements of the code it calls back to its callers. Požadavky, které tok prostřednictvím kódu transparentního z důvodu zabezpečení nemohou zvýšit oprávnění.Demands that flow through the security-transparent code cannot elevate privileges. Pokud aplikace s nízkou důvěryhodností volá kód transparentní pro zabezpečení a způsobuje poptávku s vysokým oprávněním, požadavek se přesměruje zpět na kód s nízkou důvěryhodností a selže.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. Kód transparentní z důvodu zabezpečení nemůže zastavit požadavek, protože nemůže provádět kontrolní akce.The security-transparent code cannot stop the demand because it cannot perform assert actions. Stejný transparentní kód, který je volán z plně důvěryhodného kódu, má za následek úspěšnou poptávku.The same security-transparent code called from full-trust code results in a successful demand.

Kritické zabezpečení je opakem transparentního z hlediska zabezpečení.Security-critical is the opposite of security-transparent. Kód kritický pro zabezpečení se spouští s úplným vztahem důvěryhodnosti a může provádět všechny privilegované operace.Security-critical code executes with full trust and can perform all privileged operations. Bezpečný a kritický kód je privilegovaný kód, který byl prostřednictvím rozsáhlého auditu zabezpečení, aby bylo možné ověřit, že neumožňuje částečně důvěryhodným volajícím používat prostředky, ke kterým nemají oprávnění k přístupu.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.

Transparentnost je nutné použít explicitně.You have to apply transparency explicitly. Většina vašeho kódu, který zpracovává manipulaci s daty a logiku, může být obvykle označena jako transparentní z hlediska zabezpečení, zatímco menší množství kódu, který provádí zvýšení oprávnění, je označeno jako kritické pro zabezpečení nebo bezpečné pro zabezpečení.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.

Důležité

Transparentnost první úrovně je omezená na rozsah sestavení; není vynutilo mezi sestaveními.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. Transparentnost první úrovně se primárně používala v rámci Microsoftu pro účely auditu zabezpečení.Level 1 transparency was primarily used within Microsoft for security audit purposes. Typy a členy kritické pro zabezpečení v rámci sestavení úrovně 1 mohou být k dispozici v kódu transparentním z hlediska zabezpečení v jiných sestaveních.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. Je důležité, abyste provedli požadavky propojení na úplný vztah důvěryhodnosti ve všech typech a členech, které jsou kritické pro zabezpečení úrovně 1.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. Typy a členy kritické pro zabezpečení musí také potvrdit, že volající mají oprávnění k chráněným prostředkům, ke kterým má přístup daný typ nebo člen.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

Pro zpětnou kompatibilitu s předchozími verzemi .NET Framework jsou všichni členové, kteří nejsou poopatřeni atributy transparentnosti, považováni za bezpečné a kritické pro zabezpečení.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. Všechny typy, které nejsou opatřeny poznámkami, jsou považovány za transparentní.All types that are not annotated are considered to be transparent. Nejsou k dispozici žádná pravidla statických analýz pro ověření transparentnosti.There are no static analysis rules to validate transparency. Proto může být nutné ladit chyby transparentnosti v době běhu.Therefore, you may need to debug transparency errors at run time.

Atributy transparentnostiTransparency Attributes

V následující tabulce jsou popsány tři atributy, které lze použít k přidání poznámky k vašemu kódu k průhlednosti.The following table describes the three attributes that you use to annotate your code for transparency.

AtributAttribute PopisDescription
SecurityTransparentAttribute Povoluje se jenom na úrovni sestavení.Allowed only at the assembly level. Identifikuje všechny typy a členy v sestavení jako transparentní z hlediska zabezpečení.Identifies all types and members in the assembly as security-transparent. Sestavení nemůže obsahovat žádný kód kritický pro zabezpečení.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute Při použití na úrovni sestavení bez Scope Vlastnosti identifikuje všechny kódy v sestavení jako zabezpečení transparentní ve výchozím nastavení, ale označuje, že sestavení může obsahovat kód kritický pro zabezpečení.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.

Při použití na úrovni třídy identifikuje třídu nebo metodu jako kritické pro zabezpečení, ale ne členy třídy.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Pro zajištění kritického zabezpečení všech členů nastavte Scope vlastnost na hodnotu Everything .To make all the members security-critical, set the Scope property to Everything.

Při použití na úrovni člena platí atribut pouze pro daného člena.When used at the member level, the attribute applies only to that member.

Třída nebo člen identifikovaný jako kritické pro zabezpečení mohou provádět zvýšení oprávnění.The class or member identified as security-critical can perform elevations of privilege. Důležité informace: V transparentnosti úrovně 1 jsou typy a členy kritické pro zabezpečení považovány za bezpečné – kritické, pokud jsou volány mimo sestavení.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the assembly. Je nutné chránit typy a členy kritické pro zabezpečení s požadavkem na propojení pro úplný vztah důvěryhodnosti, aby se předešlo neoprávněnému zvýšení oprávnění.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Identifikuje kód kritický pro zabezpečení, ke kterému lze přistupovat pomocí transparentního kódu v sestavení.Identifies security-critical code that can be accessed by security-transparent code in the assembly. V opačném případě kód transparentní z hlediska zabezpečení nemůže přistupovat ke soukromým nebo interním členům kritickým pro zabezpečení ve stejném sestavení.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Tím by došlo k ovlivnění kódu kritického pro zabezpečení a zajištění neočekávaných zvýšení oprávnění.Doing so would influence security-critical code and make unexpected elevations of privilege possible. Bezpečný a kritický kód pro zabezpečení by měl projít přísným auditem zabezpečení.Security-safe-critical code should undergo a rigorous security audit. Poznámka: Typy a členy kritické pro zabezpečení musí ověřit oprávnění volajících a určit, zda má volající oprávnění k přístupu k chráněným prostředkům.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

SecuritySafeCriticalAttributeAtribut umožňuje kódu transparentnímu z hlediska zabezpečení přistupovat ke členům kritickým pro zabezpečení ve stejném sestavení.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Ve vašem sestavení zvažte kód transparentní z hlediska zabezpečení a kritický pro zabezpečení, který je rozdělen do dvou sestavení.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. Kód transparentní z hlediska zabezpečení by nedokázal zobrazit soukromé nebo interní členy kódu kritického pro zabezpečení.The security-transparent code would not be able to see the private or internal members of the security-critical code. Kód kritický pro zabezpečení je kromě toho obecně auditován pro přístup k jeho veřejnému rozhraní.Additionally, the security-critical code is generally audited for access to its public interface. Neočekáváte, že privátní nebo interní stav bude přístupný mimo sestavení; Chcete zachovat stav izolované.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. SecuritySafeCriticalAttributeAtribut udržuje izolaci stavu mezi kódem transparentním z hlediska zabezpečení a kritickým pro zabezpečení a zároveň nabízí možnost přepsat izolaci, pokud je to nezbytné.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. Kód transparentní z hlediska zabezpečení nemůže získat přístup k privátnímu nebo internímu kódu kritickému pro zabezpečení, pokud tyto členy nebyly označeny SecuritySafeCriticalAttribute .Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Před použitím SecuritySafeCriticalAttribute proveďte audit tohoto člena, jako kdyby byl veřejně vystavený.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Poznámka na úrovni sestaveníAssembly-wide Annotation

Následující tabulka popisuje účinky použití atributů zabezpečení na úrovni sestavení.The following table describes the effects of using security attributes at the assembly level.

Atribut AssemblyAssembly attribute Stav sestaveníAssembly state
Žádný atribut v částečně důvěryhodném sestaveníNo attribute on a partially trusted assembly Všechny typy a členy jsou transparentní.All types and members are transparent.
Žádný atribut v plně důvěryhodném sestavení (v globální mezipaměti sestavení (GAC) nebo identifikovaný jako úplný vztah důvěryhodnosti v rozhraní AppDomain )No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Všechny typy jsou transparentní a všechny členy jsou bezpečné a kritické pro zabezpečení.All types are transparent and all members are security-safe-critical.
SecurityTransparent Všechny typy a členy jsou transparentní.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Všechny typy a členy jsou kritické pro zabezpečení.All types and members are security-critical.
SecurityCritical Veškerý kód je standardně transparentní.All code defaults to transparent. Jednotlivé typy a členy však mohou mít jiné atributy.However, individual types and members can have other attributes.

Příklady transparentnosti zabezpečeníSecurity Transparency Examples

Chcete-li použít pravidla transparentnosti .NET Framework 2,0 (transparentnost první úrovně), použijte následující anotaci sestavení:To use the .NET Framework 2.0 transparency rules (level 1 transparency), use the following assembly annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Pokud chcete, aby celé sestavení bylo transparentní pro indikaci, že sestavení neobsahuje žádný kritický kód a nezvyšuje oprávnění jakýmkoli způsobem, můžete explicitně přidat průhlednost do sestavení s následujícím atributem: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]  

Pokud chcete ve stejném sestavení kombinovat klíč kritického a transparentního kódu, začněte tím, že označíte sestavení s SecurityCriticalAttribute atributem k označení toho, že sestavení může obsahovat kritický kód, a to takto: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]  

Chcete-li provést akce kritické pro zabezpečení, je nutné explicitně označit kód, který provede kritickou akci s jiným SecurityCriticalAttribute atributem, jak je znázorněno v následujícím příkladu kódu: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 */ }  
    }  
}  

Předchozí kód je transparentní s výjimkou Critical metody, která je explicitně označena jako kritická pro zabezpečení.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. Transparentnost je výchozí nastavení, dokonce i s atributem na úrovni sestavení SecurityCriticalAttribute .Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

Viz takéSee also