Código transparente en seguridad, nivel 2Security-Transparent Code, Level 2

Precaución

Seguridad de acceso del código y código de confianza parcialCode Access Security and Partially Trusted Code

.NET Framework proporciona seguridad de acceso del código (CAS), que es un mecanismo para el cumplimiento de los distintos niveles de confianza en diferentes códigos que se ejecutan en la misma aplicación.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). La seguridad de acceso de código de .NET Framework no debería usarse como mecanismo para reforzar los límites de seguridad basados en el origen del código u otros aspectos de identidad.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 actualizando las guías para reflejar que la seguridad de acceso de código y el código transparente de seguridad no se podrán usar como límites de seguridad con código de confianza parcial, especialmente en código con orígenes desconocidos.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. Le aconsejamos que no cargue ni ejecute código de orígenes desconocidos sin contar con medidas de seguridad alternativas.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Esta directiva se aplica a todas las versiones de .NET Framework, pero no se aplica a la versión de .NET Framework incluida en Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Transparencia de nivel 2 se introdujo en .NET Framework 4.Level 2 transparency was introduced in the .NET Framework 4. Los tres principios de este modelo son código transparente, código crítico para la seguridad y disponible desde código transparente, y código crítico para la seguridad.The three tenets of this model are transparent code, security-safe-critical code, and security-critical code.

  • El código transparente, incluido el código que se ejecuta como de plena confianza, solo puede llamar a otro código transparente o a código crítico para la seguridad y disponible desde código transparente.Transparent code, including code that is running as full trust, can call other transparent code or security-safe-critical code only. Solo puede realizar acciones permitidas por el conjunto de permisos de confianza parcial del dominio (si existe).It can only perform actions allowed by the domain’s partial trust permission set (if one exists). El código transparente no puede hacer lo siguiente:Transparent code cannot do the following:

    • Realizar una instrucción Assert o una elevación de privilegios.Perform an Assert or elevation of privilege.

    • Contener código no seguro o no comprobable.Contain unsafe or unverifiable code.

    • Llamar directamente a código crítico.Directly call critical code.

    • Llamar a código nativo o código con el atributo SuppressUnmanagedCodeSecurityAttribute.Call native code or code with the SuppressUnmanagedCodeSecurityAttribute attribute.

    • Llamar a un miembro que está protegido por LinkDemand.Call a member that is protected by a LinkDemand.

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

    Además, los métodos transparentes no pueden invalidar métodos virtuales críticos o implementar métodos de interfaz críticos.In addition, transparent methods cannot override critical virtual methods or implement critical interface methods.

  • El código crítico para la seguridad es de plena confianza, pero el código transparente puede llamarlo.Safe-critical code is fully trusted but is callable by transparent code. Expone un área expuesta limitada de código de plena confianza; las comprobaciones de corrección y seguridad se producen en código crítico para la seguridad.It exposes a limited surface area of full-trust code; correctness and security verifications happen in safe-critical code.

  • El código crítico para la seguridad puede llamar a cualquier código y es de plena confianza, pero no se puede llamar mediante código transparente.Security-critical code can call any code and is fully trusted, but it cannot be called by transparent code.

Este tema contiene las siguientes secciones:This topic contains the following sections:

Ejemplos de uso y comportamientosUsage Examples and Behaviors

Para especificar las reglas de .NET Framework 4 (transparencia de nivel 2), use la siguiente anotación para un ensamblado:To specify .NET Framework 4 rules (level 2 transparency), use the following annotation for an assembly:

[assembly: SecurityRules(SecurityRuleSet.Level2)]

Para bloquear en las reglas de .NET Framework 2.0 (transparencia de nivel 1), use la siguiente anotación:To lock into the .NET Framework 2.0 rules (level 1 transparency), use the following annotation:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Si no anota un ensamblado, las reglas de .NET Framework 4 se usan de forma predeterminada.If you do not annotate an assembly, the .NET Framework 4 rules are used by default. Sin embargo, la práctica recomendada es usar el SecurityRulesAttribute en lugar del atributo según el valor predeterminado.However, the recommended best practice is to use the SecurityRulesAttribute attribute instead of depending on the default.

Anotación de todo el ensambladoAssembly-wide Annotation

Las reglas siguientes se aplican al uso de atributos en el nivel de ensamblado:The following rules apply to the use of attributes at the assembly level:

  • No hay atributos: Si no especifica ningún atributo, el tiempo de ejecución interpreta todo el código como crítico para la seguridad, excepto cuando es crítico para la seguridad infringen una regla de herencia (por ejemplo, al invalidar o implementar un modo transparente el método de interfaz o virtual).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). En esos casos, los métodos son críticos para la seguridad.In those cases, the methods are safe-critical. Si no se especifica ningún atributo, Common Language Runtime determina las reglas de transparencia automáticamente.Specifying no attribute causes the common language runtime to determine the transparency rules for you.

  • SecurityTransparent: Todo el código es transparente; el ensamblado completo no hará nada con privilegios o unsafe.SecurityTransparent: All code is transparent; the entire assembly will not do anything privileged or unsafe.

  • SecurityCritical: Todo el código introducido por tipos en este ensamblado es crítico; el código restante es transparente.SecurityCritical: All code that is introduced by types in this assembly is critical; all other code is transparent. Este escenario se parece a cuando no se especifica ningún atributo; sin embargo, Common Language Runtime no determina automáticamente las reglas de transparencia.This scenario is similar to not specifying any attributes; however, the common language runtime does not automatically determine the transparency rules. Por ejemplo, si invalida un método virtual o abstracto o si implementa un método de interfaz, de forma predeterminada, ese método es transparente.For example, if you override a virtual or abstract method or implement an interface method, by default, that method is transparent. Debe anotar explícitamente el método como SecurityCritical o SecuritySafeCritical; de lo contrario, se producirá una TypeLoadException en tiempo de carga.You must explicitly annotate the method as SecurityCritical or SecuritySafeCritical; otherwise, a TypeLoadException will be thrown at load time. Esta regla también se aplica cuando la clase base y la clase derivada están en el mismo ensamblado.This rule also applies when both the base class and the derived class are in the same assembly.

  • AllowPartiallyTrustedCallers (nivel 2 solo): El valor predeterminado de todo el código es transparente.AllowPartiallyTrustedCallers (level 2 only): All code defaults to transparent. Sin embargo, los miembros y tipos individuales pueden tener otros atributos.However, individual types and members can have other attributes.

En la tabla siguiente compara el comportamiento de nivel de ensamblado de nivel 2 y nivel 1.The following table compares the assembly level behavior for Level 2 with Level 1.

Assembly (atributo)Assembly attribute Nivel 2Level 2 nivel 1Level 1
Ningún atributo en un ensamblado de confianza parcialNo attribute on a partially trusted assembly Los tipos y los miembros son transparentes de forma predeterminada, pero pueden ser críticos para la seguridad o bien críticos para la seguridad y disponibles desde código transparente.Types and members are by default transparent, but can be security-critical or security-safe-critical. Todos los tipos y los miembros son transparentes.All types and members are transparent.
Ningún atributoNo attribute Si no se especifica ningún atributo, Common Language Runtime determina las reglas de transparencia automáticamente.Specifying no attribute causes the common language runtime to determine the transparency rules for you. Todos los tipos y los miembros son críticos para la seguridad, excepto cuando el hecho de ser críticos para la seguridad infringe una regla de herencia.All types and members are security-critical, except where being security-critical violates an inheritance rule. En un ensamblado de plena confianza (en la caché global de ensamblados, o identificado como de plena confianza en AppDomain), todos los tipos son transparentes y todos los miembros son críticos para la seguridad y disponibles desde código transparente.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 los tipos y los miembros son transparentes.All types and members are transparent. Todos los tipos y los miembros son transparentes.All types and members are transparent.
SecurityCritical(SecurityCriticalScope.Everything) No es aplicable.Not applicable. Todos los tipos y los miembros son críticos para la seguridad.All types and members are security-critical.
SecurityCritical Todo el código introducido por tipos en este ensamblado es crítico; el código restante es transparente.All code that is introduced by types in this assembly is critical; all other code is transparent. Si invalida un método virtual o abstracto o si implementa un método de interfaz, debe anotar explícitamente ese método como SecurityCritical o SecuritySafeCritical.If you override a virtual or abstract method or implement an interface method, you must explicitly annotate the method as SecurityCritical or SecuritySafeCritical. El valor predeterminado de todo el código es transparente.All code defaults to transparent. Sin embargo, los miembros y tipos individuales pueden tener otros atributos.However, individual types and members can have other attributes.

Anotación de tipos y de miembrosType and Member Annotation

Los atributos de seguridad que se aplican a un tipo también se aplican a los miembros que el tipo introduce.The security attributes that are applied to a type also apply to the members that are introduced by the type. Sin embargo, no se aplican a invalidaciones virtuales o abstractas de la clase base o implementaciones de interfaz.However, they do not apply to virtual or abstract overrides of the base class or interface implementations. Las reglas siguientes se aplican al uso de atributos en el nivel de tipo y miembro:The following rules apply to the use of attributes at the type and member level:

  • SecurityCritical: El tipo o miembro es crítico y se puede llamar a solamente el código de plena confianza.SecurityCritical: The type or member is critical and can be called only by full-trust code. Los métodos que se introducen en un tipo crítico para la seguridad son críticos.Methods that are introduced in a security-critical type are critical.

    Importante

    Los métodos abstractos y virtuales que se introducen en interfaces o clases base y que se invalidan o se implementan en una clase crítica para la seguridad son transparentes de forma predeterminada.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. Se deben identificar como SecuritySafeCritical o SecurityCritical.They must be identified as either SecuritySafeCritical or SecurityCritical.

  • SecuritySafeCritical: El tipo o miembro es crítico para la seguridad.SecuritySafeCritical: The type or member is safe-critical. Sin embargo, puede llamarse al tipo o miembro desde código transparente (de confianza parcial) y es tan capaz como cualquier otro 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. El código se debe auditar para la seguridad.The code must be audited for security.

Volver al principioBack to top

Patrones de invalidaciónOverride Patterns

La siguiente tabla muestra las invalidaciones de método permitidas para la transparencia de nivel 2.The following table shows the method overrides allowed for level 2 transparency.

Miembro base virtual/de interfazBase virtual/interface member Invalidación/interfazOverride/interface
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

Volver al principioBack to top

Reglas de herenciaInheritance Rules

En esta sección, se asigna el siguiente orden a código Transparent, Critical y SafeCritical en función del acceso y las capacidades:In this section, the following order is assigned to Transparent, Critical, and SafeCritical code based on access and capabilities:

Transparent < SafeCritical < Critical

  • Reglas para tipos: Va de izquierda a derecha, el acceso se vuelve más restrictivo.Rules for types: Going from left to right, access becomes more restrictive. Los tipos derivados deben ser al menos tan restrictivos como el tipo base.Derived types must be at least as restrictive as the base type.

  • Reglas para métodos: Los métodos derivados no pueden cambiar la accesibilidad del método base.Rules for methods: Derived methods cannot change accessibility from the base method. Para el comportamiento predeterminado, todos los métodos derivados no anotados son Transparent.For default behavior, all derived methods that are not annotated are Transparent. Los derivados de tipos críticos provocan una excepción que se produce si el método invalidado no está anotado explícitamente como SecurityCritical.Derivatives of critical types cause an exception to be thrown if the overridden method is not explicitly annotated as SecurityCritical.

En la tabla siguiente se muestran los patrones de herencia de tipo permitidos.The following table shows the allowed type inheritance patterns.

Clase baseBase class La clase derivada puede serDerived class can be
Transparent Transparent
Transparent SafeCritical
Transparent Critical
SafeCritical SafeCritical
SafeCritical Critical
Critical Critical

En la tabla siguiente se muestran los patrones de herencia de tipo no permitidos.The following table shows the disallowed type inheritance patterns.

Clase baseBase class La clase derivada no puede serDerived class cannot be
SafeCritical Transparent
Critical Transparent
Critical SafeCritical

En la tabla siguiente se muestran los patrones de herencia de método permitidos.The following table shows the allowed method inheritance patterns.

Método baseBase method El método derivado puede serDerived method can be
Transparent Transparent
Transparent SafeCritical
SafeCritical Transparent
SafeCritical SafeCritical
Critical Critical

En la tabla siguiente se muestran los patrones de herencia de método no permitidos.The following table shows the disallowed method inheritance patterns.

Método baseBase method El método derivado no puede serDerived method cannot be
Transparent Critical
SafeCritical Critical
Critical Transparent
Critical SafeCritical

Nota

Estas reglas de herencia se aplican a los tipos y miembros de nivel 2.These inheritance rules apply to level 2 types and members. Los tipos de ensamblados de nivel 1 pueden heredar de tipos y miembros críticos para la seguridad de nivel 2.Types in level 1 assemblies can inherit from level 2 security-critical types and members. Por lo tanto, los tipos y miembros de nivel 2 deben tener peticiones de herencia independientes para los herederos de nivel 1.Therefore, level 2 types and members must have separate inheritance demands for level 1 inheritors.

Volver al principioBack to top

Información y reglas adicionalesAdditional Information and Rules

Compatibilidad con LinkDemandLinkDemand Support

El modelo de transparencia de nivel 2 reemplaza LinkDemand con el atributo SecurityCriticalAttribute.The level 2 transparency model replaces the LinkDemand with the SecurityCriticalAttribute attribute. En código heredado (nivel 1), LinkDemand se trata automáticamente como Demand.In legacy (level 1) code, a LinkDemand is automatically treated as a Demand.

ReflexiónReflection

El hecho de invocar un método crítico o leer un campo crítico desencadena una petición de plena confianza (como si se estuviera invocando un método o campo privados).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). Por lo tanto, el código de plena confianza puede invocar un método crítico, mientras que el código de confianza parcial no puede.Therefore, full-trust code can invoke a critical method, whereas partial-trust code cannot.

Se han agregado las siguientes propiedades al espacio de nombres System.Reflection para determinar si el tipo, método o campo es SecurityCritical, SecuritySafeCritical o SecurityTransparent: IsSecurityCritical, IsSecuritySafeCritical y 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 estas propiedades para determinar la transparencia mediante la reflexión en lugar de comprobar la presencia del atributo.Use these properties to determine transparency by using reflection instead of checking for the presence of the attribute. Las reglas de transparencia son complejas y la comprobación del atributo podría no ser suficiente.The transparency rules are complex, and checking for the attribute may not be sufficient.

Nota

Un SafeCritical devuelve del método true para ambos IsSecurityCritical y IsSecuritySafeCritical, porque SafeCritical es crítico (tiene las mismas funcionalidades que el código crítico, pero se puede llamar desde código transparente).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).

Los métodos dinámicos heredan la transparencia de los módulos a los que se adjuntan; no heredan la transparencia del tipo (si están conectados a un 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).

Omitir la comprobación en plena confianzaSkip Verification in Full Trust

Puede omitir la comprobación para ensamblados transparentes de plena confianza estableciendo la propiedad SkipVerificationInFullTrust en true en el 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)]

La propiedad SkipVerificationInFullTrust es false de forma predeterminada, por lo que la propiedad debe establecerse en true para omitir la comprobación.The SkipVerificationInFullTrust property is false by default, so the property must be set to true to skip verification. Esto debe hacerse únicamente con fines de optimización.This should be done for optimization purposes only. Debe asegurarse de que el código transparente en el ensamblado sea comprobable usando la transparent opción el herramienta PEVerify.You should ensure that the transparent code in the assembly is verifiable by using the transparent option in the PEVerify tool.

Vea tambiénSee also