Código transparente de segurança, nível 2Security-Transparent Code, Level 2

Cuidado

Segurança de Acesso do Código e Código Parcialmente ConfiávelCode Access Security and Partially Trusted Code

O .NET Framework fornece um mecanismo para a imposição de níveis variáveis de confiança em códigos diferentes em execução no mesmo aplicativo chamado CAS (Segurança de Acesso do Código).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). O CAS no .NET Framework não deve ser usado como um mecanismo de imposição de limites de segurança com base na origem do código ou em outros aspectos da identidade.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Estamos atualizando nossas diretrizes para refletir que o CAS e o Código Transparente de Segurança não terão suporte como um limite de segurança com código parcialmente confiável, especialmente o código de origem desconhecida.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Não aconselhamos carregar e executar códigos de origens desconhecidas sem a adoção de medidas de segurança alternativas no local.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Essa política é aplicável à todas as versões do .NET Framework, mas não é aplicável ao .NET Framework incluído no Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

A transparência de nível 2 foi introduzida no .NET Framework 4.Level 2 transparency was introduced in the .NET Framework 4. As três filosofias desse modelo são código Transparent, segurança – código crítico e com segurança crítica.The three tenets of this model are transparent code, security-safe-critical code, and security-critical code.

  • O código Transparent, incluindo o código que está sendo executado como confiança total, pode chamar outros códigos transparentes ou somente com segurança crítica.Transparent code, including code that is running as full trust, can call other transparent code or security-safe-critical code only. Ele só pode executar ações permitidas pelo conjunto de permissões de confiança parcial do domínio (se houver).It can only perform actions allowed by the domain’s partial trust permission set (if one exists). O código transparent não pode fazer o seguinte:Transparent code cannot do the following:

    • Execute um Assert ou elevação de privilégio.Perform an Assert or elevation of privilege.

    • Conter código não seguro ou não verificável.Contain unsafe or unverifiable code.

    • Chame diretamente o código crítico.Directly call critical code.

    • Chame código nativo ou código com o atributo SuppressUnmanagedCodeSecurityAttribute.Call native code or code with the SuppressUnmanagedCodeSecurityAttribute attribute.

    • Chamar um membro que é protegido por um LinkDemand.Call a member that is protected by a LinkDemand.

    • Herdar de tipos críticos.Inherit from critical types.

    Além disso, os métodos Transparent não podem substituir métodos virtuais críticos nem implementar métodos de interface críticos.In addition, transparent methods cannot override critical virtual methods or implement critical interface methods.

  • O código crítico seguro é totalmente confiável, mas é possível chamá-lo por código Transparent.Safe-critical code is fully trusted but is callable by transparent code. Ele expõe uma área de superfície limitada de código de confiança total; a correção e as verificações de segurança ocorrem em código crítico seguro.It exposes a limited surface area of full-trust code; correctness and security verifications happen in safe-critical code.

  • O código de segurança crítica pode chamar qualquer código e é totalmente confiável, mas não pode ser chamado pelo código Transparent.Security-critical code can call any code and is fully trusted, but it cannot be called by transparent code.

Exemplos de Uso e ComportamentosUsage Examples and Behaviors

Para especificar .NET Framework regras de 4 (transparência de nível 2), use a seguinte anotação para um assembly:To specify .NET Framework 4 rules (level 2 transparency), use the following annotation for an assembly:

[assembly: SecurityRules(SecurityRuleSet.Level2)]

Para bloquear as regras do .NET Framework 2,0 (transparência de nível 1), use a seguinte anotação:To lock into the .NET Framework 2.0 rules (level 1 transparency), use the following annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Se você não anotar um assembly, as regras .NET Framework 4 serão usadas por padrão.If you do not annotate an assembly, the .NET Framework 4 rules are used by default. No entanto, a prática recomendada é usar o atributo SecurityRulesAttribute em vez de dependendo do padrão.However, the recommended best practice is to use the SecurityRulesAttribute attribute instead of depending on the default.

Anotação em todo o assemblyAssembly-wide Annotation

As regras a seguir se aplicam ao uso de atributos no nível do assembly:The following rules apply to the use of attributes at the assembly level:

  • Nenhum atributo: se você não especificar nenhum atributo, o tempo de execução interpretará todo o código como segurança crítica, exceto onde a segurança crítica viola uma regra de herança (por exemplo, ao substituir ou implementar um método de interface ou virtual transparente ).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). Nesses casos, os métodos são de segurança crítica.In those cases, the methods are safe-critical. Especificar nenhum atributo faz com que o Common Language Runtime determine as regras de transparência para você.Specifying no attribute causes the common language runtime to determine the transparency rules for you.

  • SecurityTransparent: todo o código é transparente; o assembly inteiro não fará nada privilegiado nem seguro.SecurityTransparent: All code is transparent; the entire assembly will not do anything privileged or unsafe.

  • SecurityCritical: todo o código introduzido por tipos neste assembly é crítico; todo o outro código é transparente.SecurityCritical: All code that is introduced by types in this assembly is critical; all other code is transparent. Esse cenário é semelhante a não especificar nenhum atributo; no entanto, o Common Language Runtime não determina automaticamente as regras de transparência.This scenario is similar to not specifying any attributes; however, the common language runtime does not automatically determine the transparency rules. Por exemplo, se você substituir um método virtual ou abstract ou implementar um método de interface, por padrão, esse método será transparente.For example, if you override a virtual or abstract method or implement an interface method, by default, that method is transparent. Você deve anotar explicitamente o método como SecurityCritical ou SecuritySafeCritical; caso contrário, uma TypeLoadException será lançada no tempo de carregamento.You must explicitly annotate the method as SecurityCritical or SecuritySafeCritical; otherwise, a TypeLoadException will be thrown at load time. Essa regra também se aplica quando a classe base e a classe derivada estão no mesmo assembly.This rule also applies when both the base class and the derived class are in the same assembly.

  • AllowPartiallyTrustedCallers (somente nível 2): todos os padrões de código são transparentes.AllowPartiallyTrustedCallers (level 2 only): All code defaults to transparent. No entanto, tipos individuais e membros podem ter outros atributos.However, individual types and members can have other attributes.

A tabela a seguir compara o comportamento de nível de assembly para o nível 2 com o nível 1.The following table compares the assembly level behavior for Level 2 with Level 1.

Atributo de assemblyAssembly attribute Nível 2Level 2 Nível 1Level 1
Nenhum atributo em um assembly parcialmente confiávelNo attribute on a partially trusted assembly Os tipos e membros são, por padrão, transparentes, mas podem ser críticos para segurança ou com segurança crítica.Types and members are by default transparent, but can be security-critical or security-safe-critical. Todos os tipos e membros são transparentes.All types and members are transparent.
Nenhum atributoNo attribute Especificar nenhum atributo faz com que o Common Language Runtime determine as regras de transparência para você.Specifying no attribute causes the common language runtime to determine the transparency rules for you. Todos os tipos e membros são críticos à segurança, exceto onde a segurança crítica viola uma regra de herança.All types and members are security-critical, except where being security-critical violates an inheritance rule. Em um assembly totalmente confiável (no cache de assembly global ou identificado como confiança total no AppDomain), todos os tipos são transparentes e todos os membros são críticos à segurança.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 Todos os tipos e membros são transparentes.All types and members are transparent. Todos os tipos e membros são transparentes.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) Não aplicável.Not applicable. Todos os tipos e membros são críticos para a segurança.All types and members are security-critical.
SecurityCritical Todo o código introduzido por tipos neste assembly é crítico; todo o outro código é transparente.All code that is introduced by types in this assembly is critical; all other code is transparent. Se você substituir um método virtual ou abstract ou implementar um método de interface, você deverá anotar explicitamente o método como SecurityCritical ou SecuritySafeCritical.If you override a virtual or abstract method or implement an interface method, you must explicitly annotate the method as SecurityCritical or SecuritySafeCritical. Todos os padrões de código são transparentes.All code defaults to transparent. No entanto, tipos individuais e membros podem ter outros atributos.However, individual types and members can have other attributes.

Tipo e Anotação do MembroType and Member Annotation

Os atributos de segurança que são aplicados a um tipo também se aplicam aos membros que são introduzidos pelo tipo.The security attributes that are applied to a type also apply to the members that are introduced by the type. No entanto, eles não se aplicam a substituições virtuais ou abstratas da classe base ou implementações de interface.However, they do not apply to virtual or abstract overrides of the base class or interface implementations. As regras a seguir se aplicam ao uso de atributos no nível de tipo e de membro:The following rules apply to the use of attributes at the type and member level:

  • SecurityCritical: o tipo ou membro é crítico e pode ser chamado somente pelo código de confiança total.SecurityCritical: The type or member is critical and can be called only by full-trust code. Os métodos que são introduzidos em um tipo de segurança crítica são críticos.Methods that are introduced in a security-critical type are critical.

    Importante

    Os métodos virtuais e abstratos que são introduzidos em classes base ou interfaces, e substituídos ou implementados em uma classe de segurança crítica são transparentes por padrão.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. Eles devem ser identificados como SecuritySafeCritical ou SecurityCritical.They must be identified as either SecuritySafeCritical or SecurityCritical.

  • SecuritySafeCritical: o tipo ou o membro é crítico e seguro.SecuritySafeCritical: The type or member is safe-critical. No entanto, o tipo ou membro pode ser chamado de código transparente (parcialmente confiável) e é compatível como qualquer outro código crítico.However, the type or member can be called from transparent (partially trusted) code and is as capable as any other critical code. O código deve ser auditado quanto à segurança.The code must be audited for security.

Substituir PadrõesOverride Patterns

A tabela a seguir mostra as substituições de método permitidas para transparência de nível 2.The following table shows the method overrides allowed for level 2 transparency.

Membro de interface/virtual baseBase virtual/interface member Substituição/interfaceOverride/interface
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

Regras de HerançaInheritance Rules

Nesta seção, a seguinte ordem é atribuída a Transparent, Criticale SafeCritical código com base no acesso e nos recursos:In this section, the following order is assigned to Transparent, Critical, and SafeCritical code based on access and capabilities:

Transparent < SafeCritical < Critical

  • Regras para tipos: indo da esquerda para a direita, o acesso se torna mais restritivo.Rules for types: Going from left to right, access becomes more restrictive. Os tipos derivados devem ser pelo menos tão restritivos quanto o tipo base.Derived types must be at least as restrictive as the base type.

  • Regras para métodos: métodos derivados não podem alterar a acessibilidade do método base.Rules for methods: Derived methods cannot change accessibility from the base method. Para o comportamento padrão, todos os métodos derivados que não são anotados são Transparent.For default behavior, all derived methods that are not annotated are Transparent. Derivações de tipos críticos causam uma exceção a ser gerada se o método substituído não for anotado explicitamente como SecurityCritical.Derivatives of critical types cause an exception to be thrown if the overridden method is not explicitly annotated as SecurityCritical.

A tabela a seguir mostra os padrões de herança de tipo permitidos.The following table shows the allowed type inheritance patterns.

Classe baseBase class A classe derivada pode serDerived class can be
Transparent Transparent
Transparent SafeCritical
Transparent Critical
SafeCritical SafeCritical
SafeCritical Critical
Critical Critical

A tabela a seguir mostra os padrões de herança de tipo não permitido.The following table shows the disallowed type inheritance patterns.

Classe baseBase class A classe derivada não pode serDerived class cannot be
SafeCritical Transparent
Critical Transparent
Critical SafeCritical

A tabela a seguir mostra os padrões de herança de método permitidos.The following table shows the allowed method inheritance patterns.

Método baseBase method O método derivado pode serDerived method can be
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

A tabela a seguir mostra os padrões de herança de método não permitido.The following table shows the disallowed method inheritance patterns.

Método baseBase method O método derivado não pode serDerived method cannot be
Transparent Critical
SafeCritical Critical
Critical Transparent
Critical SafeCritical

Observação

Essas regras de herança se aplicam a tipos e membros de nível 2.These inheritance rules apply to level 2 types and members. Os tipos em assemblies de nível 1 podem herdar de membros e tipos de segurança de nível 2-críticos.Types in level 1 assemblies can inherit from level 2 security-critical types and members. Portanto, os tipos de nível 2 e os membros devem ter demandas de herança separadas para herdeiros de nível 1.Therefore, level 2 types and members must have separate inheritance demands for level 1 inheritors.

Informações Adicionais e RegrasAdditional Information and Rules

Suporte LinkDemandLinkDemand Support

O modelo de transparência nível 2 substitui o LinkDemand pelo atributo SecurityCriticalAttribute.The level 2 transparency model replaces the LinkDemand with the SecurityCriticalAttribute attribute. No código herdado (nível 1), um LinkDemand é tratado automaticamente como um Demand.In legacy (level 1) code, a LinkDemand is automatically treated as a Demand.

ReflexãoReflection

Invocar um método crítico ou ler um campo crítico dispara uma demanda de confiança total (assim como se você estivesse invocando um método ou um campo particular).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). Portanto, o código de confiança total pode invocar um método crítico, enquanto o código de confiança parcial não pode.Therefore, full-trust code can invoke a critical method, whereas partial-trust code cannot.

As propriedades a seguir foram adicionadas ao namespace System.Reflection para determinar se o tipo, o método ou o campo é SecurityCritical, SecuritySafeCriticalou SecurityTransparent: IsSecurityCritical, IsSecuritySafeCriticale 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. Use essas propriedades para determinar a transparência usando reflexão em vez de verificar a presença do atributo.Use these properties to determine transparency by using reflection instead of checking for the presence of the attribute. As regras de transparência são complexas e a verificação do atributo pode não ser suficiente.The transparency rules are complex, and checking for the attribute may not be sufficient.

Observação

Um método SafeCritical retorna true para IsSecurityCritical e IsSecuritySafeCritical, porque SafeCritical é realmente crítico (ele tem os mesmos recursos que o código crítico, mas pode ser chamado a partir do código Transparent).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).

Métodos dinâmicos herdam a transparência dos módulos aos quais eles estão anexados; Eles não herdam a transparência do tipo (se estiverem anexados a um tipo).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).

Ignorar Verificação em Confiança TotalSkip Verification in Full Trust

Você pode ignorar a verificação de assemblies transparentes totalmente confiáveis definindo a propriedade SkipVerificationInFullTrust como true no atributo SecurityRulesAttribute: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)]

A propriedade SkipVerificationInFullTrust é false por padrão, portanto, a propriedade deve ser definida como true para ignorar a verificação.The SkipVerificationInFullTrust property is false by default, so the property must be set to true to skip verification. Isso deve ser feito apenas para fins de otimização.This should be done for optimization purposes only. Você deve garantir que o código transparent no assembly seja verificável usando a opção transparent na ferramenta PEVerify.You should ensure that the transparent code in the assembly is verifiable by using the transparent option in the PEVerify tool.

Consulte tambémSee also