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

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.

La transparencia ayuda a los desarrolladores a escribir bibliotecas de .NET Framework más seguras que exponen la funcionalidad a código de confianza parcial.Transparency helps developers write more secure .NET Framework libraries that expose functionality to partially trusted code. La transparencia de nivel 1 se introdujo en .NET Framework versión 2.0 y se usó principalmente solo dentro de Microsoft.Level 1 transparency was introduced in the .NET Framework version 2.0 and was primarily used only within Microsoft. A partir de la .NET Framework 4, puede usar la transparencia de nivel 2.Starting with the .NET Framework 4, you can use level 2 transparency. Sin embargo, se ha conservado la transparencia de nivel 1 para que pueda identificar el código heredado que se debe ejecutar con las reglas de seguridad anteriores.However, level 1 transparency has been retained so that you can identify legacy code that must run with the earlier security rules.

Importante

Debe especificar la transparencia de nivel 1 solo para la compatibilidad; es decir, especifique el nivel 1 únicamente para el código que se desarrolló con .NET Framework 3.5 o versiones anteriores que usa AllowPartiallyTrustedCallersAttribute o que no usa el modelo de transparencia.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. Por ejemplo, use la transparencia de nivel 1 para ensamblados de .NET Framework 2.0 que permiten llamadas de llamadores de confianza parcial (APTCA).For example, use level 1 transparency for .NET Framework 2.0 assemblies that allow calls from partially trusted callers (APTCA). Para el código que se desarrolla para el .NET Framework 4, use siempre la transparencia de nivel 2.For code that is developed for the .NET Framework 4, always use level 2 transparency.

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

Modelo de transparencia de nivel 1The Level 1 Transparency Model

Cuando usa la transparencia de nivel 1, está empleando un modelo de seguridad que separa el código en métodos transparentes en seguridad, críticos para la seguridad y disponibles desde código transparente, y críticos para la seguridad.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.

Puede marcar un ensamblado entero, algunas clases de un ensamblado o algunos métodos de una clase como transparentes en seguridad.You can mark a whole assembly, some classes in an assembly, or some methods in a class as security-transparent. El código transparente en seguridad no puede elevar privilegios.Security-transparent code cannot elevate privileges. Esta restricción tiene tres consecuencias:This restriction has three consequences:

  • El código transparente en seguridad no puede realizar acciones Assert.Security-transparent code cannot perform Assert actions.

  • Cualquier petición de vínculo que se vea satisfecha por código transparente en seguridad se convierte en una demanda completa.Any link demand that would be satisfied by security-transparent code becomes a full demand.

  • Cualquier código no seguro (no comprobable) que deba ejecutarse en código transparente en seguridad hace una demanda completa para el permiso de seguridad UnmanagedCode.Any unsafe (unverifiable) code that must execute in security-transparent code causes a full demand for the UnmanagedCode security permission.

Estas reglas se aplican durante la ejecución mediante Common Language Runtime (CLR).These rules are enforced during execution by the common language runtime (CLR). El código transparente en seguridad pasa todos los requisitos de seguridad del código al que llama de vuelta a sus llamadores.Security-transparent code passes all the security requirements of the code it calls back to its callers. Las demandas que fluyen a través del código transparente en seguridad no pueden elevar privilegios.Demands that flow through the security-transparent code cannot elevate privileges. Si una aplicación de nivel de confianza bajo llama a código transparente en seguridad y crea una demanda de privilegios altos, la demanda fluirá de vuelta al código de nivel de confianza bajo y producirá un error.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. El código transparente en seguridad no puede detener la demanda porque no puede realizar acciones Assert.The security-transparent code cannot stop the demand because it cannot perform assert actions. El mismo código transparente en seguridad llamado desde código de plena confianza produce una demanda correcta.The same security-transparent code called from full-trust code results in a successful demand.

Crítico para la seguridad es lo contrario de transparente en seguridad.Security-critical is the opposite of security-transparent. El código crítico para la seguridad se ejecuta con plena confianza y puede realizar todas las operaciones con privilegios.Security-critical code executes with full trust and can perform all privileged operations. El código crítico para la seguridad y disponible desde código transparente es código con privilegios que se sometió a una auditoría de seguridad exhaustiva para confirmar que no permite que llamadores de confianza parcial usen los recursos para los que no tienen permiso de acceso.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.

Debe aplicar la transparencia de forma explícita.You have to apply transparency explicitly. La mayoría del código que administra la lógica y la manipulación de datos normalmente se puede marcar como transparente en seguridad, mientras que el menor porcentaje de código que realiza elevaciones de privilegios está marcado como crítico para la seguridad o bien crítico para la seguridad y disponible desde código transparente.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.

Importante

La transparencia de nivel 1 se limita al ámbito de ensamblado; no se aplica entre ensamblados.Level 1 transparency is limited to assembly scope; it is not enforced between assemblies. La transparencia de nivel 1 se usaba principalmente en Microsoft para realizar auditorías de seguridad.Level 1 transparency was primarily used within Microsoft for security audit purposes. El código transparente en seguridad de otros ensamblados puede acceder a los tipos y miembros críticos para la seguridad dentro de un ensamblado de nivel 1.Security-critical types and members within a level 1 assembly can be accessed by security-transparent code in other assemblies. Es importante que se realicen peticiones de vínculo de plena confianza en todos los tipos y miembros críticos para la seguridad de nivel 1.It is important that you perform link demands for full trust in all your level 1 security-critical types and members. Los tipos y miembros críticos para la seguridad y disponibles desde código transparente también deben confirmar que los llamadores tengan permisos para los recursos protegidos a los que accede el tipo o miembro.Security-safe-critical types and members must also confirm that callers have permissions for protected resources that are accessed by the type or member.

Para mantener la compatibilidad con versiones anteriores de .NET Framework, todos los miembros no anotados con atributos de transparencia se consideran críticos para la seguridad y disponibles desde código transparente.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. Todos los tipos que no están anotados se consideran transparentes.All types that are not annotated are considered to be transparent. No existen reglas de análisis estático para validar la transparencia.There are no static analysis rules to validate transparency. Por lo tanto, puede que necesite depurar errores de transparencia en tiempo de ejecución.Therefore, you may need to debug transparency errors at run time.

Atributos de transparenciaTransparency Attributes

En la tabla siguiente se describen los tres atributos que se usan para anotar el código para la transparencia.The following table describes the three attributes that you use to annotate your code for transparency.

AtributoAttribute DESCRIPCIÓNDescription
SecurityTransparentAttribute Solo se permite en el nivel de ensamblado.Allowed only at the assembly level. Identifica todos los tipos y miembros del ensamblado como transparentes en seguridad.Identifies all types and members in the assembly as security-transparent. El ensamblado no puede contener ningún código crítico para la seguridad.The assembly cannot contain any security-critical code.
SecurityCriticalAttribute Cuando se usa en el nivel de ensamblado sin la propiedad Scope, identifica todo el código del ensamblado como transparente en seguridad de forma predeterminada, pero indica que el ensamblado puede contener código crítico para la seguridad.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.

Cuando se usa en el nivel de clase, identifica la clase o método como crítico para la seguridad, pero no los miembros de la clase.When used at the class level, identifies the class or method as security-critical, but not the members of the class. Para que todos los miembros sean críticos para la seguridad, establezca la propiedad Scope en Everything.To make all the members security-critical, set the Scope property to Everything.

Cuando se usa en el nivel de miembro, el atributo se aplica solo a ese miembro.When used at the member level, the attribute applies only to that member.

La clase o miembro identificado como crítico para la seguridad puede realizar elevaciones de privilegios.The class or member identified as security-critical can perform elevations of privilege. Importante: En la transparencia de nivel 1, los tipos y miembros críticos para la seguridad se tratan como críticos para la seguridad y disponibles desde código transparente cuando se les llama desde fuera del ensamblado.Important: In level 1 transparency, security-critical types and members are treated as security-safe-critical when they are called from outside the assembly. Debe proteger los tipos y miembros críticos para la seguridad con una petición de vínculo de plena confianza para evitar la elevación de privilegios no autorizada.You should protect security-critical types and members with a link demand for full trust to avoid unauthorized elevation of privilege.
SecuritySafeCriticalAttribute Identifica el código crítico para la seguridad al que puede tener acceso el código transparente en seguridad del ensamblado.Identifies security-critical code that can be accessed by security-transparent code in the assembly. De lo contrario, el código transparente en seguridad no puede acceder a los miembros críticos para la seguridad privados o internos del mismo ensamblado.Otherwise, security-transparent code cannot access private or internal security-critical members in the same assembly. Si lo hiciera, podría influir en el código crítico para la seguridad y hacer posibles las elevaciones de privilegios imprevistas.Doing so would influence security-critical code and make unexpected elevations of privilege possible. El código crítico para la seguridad y disponible desde código transparente debe someterse a una auditoría de seguridad rigurosa.Security-safe-critical code should undergo a rigorous security audit. Nota: Los tipos y miembros críticos para la seguridad y disponibles desde código transparente deben validar los permisos de los llamadores para determinar si el llamador tiene autoridad para acceder a recursos protegidos.Note: Security-safe-critical types and members must validate the permissions of callers to determine whether the caller has authority to access protected resources.

El atributo SecuritySafeCriticalAttribute permite que el código transparente en seguridad acceda a los miembros críticos para la seguridad del mismo ensamblado.The SecuritySafeCriticalAttribute attribute enables security-transparent code to access security-critical members in the same assembly. Considere el código transparente en seguridad y crítico para la seguridad de su ensamblado como si estuviera separado en dos ensamblados.Consider the security-transparent and security-critical code in your assembly as separated into two assemblies. El código transparente en seguridad no sería capaz de ver los miembros privados o internos del código crítico para la seguridad.The security-transparent code would not be able to see the private or internal members of the security-critical code. Además, el código crítico para la seguridad suele auditarse para tener acceso a su interfaz pública.Additionally, the security-critical code is generally audited for access to its public interface. No se espera que un estado privado o interno sea accesible fuera del ensamblado; lo mejor es mantener aislado el estado.You would not expect a private or internal state to be accessible outside the assembly; you would want to keep the state isolated. El atributo SecuritySafeCriticalAttribute mantiene el aislamiento del estado entre el código transparente en seguridad y el código crítico para la seguridad, al mismo tiempo que ofrece la capacidad de invalidar el aislamiento si es necesario.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. El código transparente en seguridad no puede acceder al código crítico para la seguridad privado o interno, a menos que esos miembros se hayan marcado con SecuritySafeCriticalAttribute.Security-transparent code cannot access private or internal security-critical code unless those members have been marked with SecuritySafeCriticalAttribute. Antes de aplicar SecuritySafeCriticalAttribute, audite ese miembro como si estuviera expuesto públicamente.Before applying the SecuritySafeCriticalAttribute, audit that member as if it were publicly exposed.

Anotación de todo el ensambladoAssembly-wide Annotation

En la siguiente tabla se describen los efectos del uso de atributos de seguridad en el nivel de ensamblado.The following table describes the effects of using security attributes at the assembly level.

Assembly (atributo)Assembly attribute Estado del ensambladoAssembly state
Ningún atributo en un ensamblado de confianza parcialNo attribute on a partially trusted assembly Todos los tipos y los miembros son transparentes.All types and members are transparent.
Ningún atributo en un ensamblado de plena confianza (en la caché global de ensamblados, o identificado como de plena confianza en AppDomain)No attribute on a fully trusted assembly (in the global assembly cache or identified as full trust in the AppDomain) Todos los tipos son transparentes y todos los miembros son críticos para la seguridad y disponibles desde código transparente.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.
SecurityCritical(SecurityCriticalScope.Everything) Todos los tipos y los miembros son críticos para la seguridad.All types and members are security-critical.
SecurityCritical 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.

Ejemplos de transparencia de seguridadSecurity Transparency Examples

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

[assembly: SecurityRules(SecurityRuleSet.Level1)]  

Si desea que un ensamblado entero sea transparente para indicar que no contiene código crítico y que no eleva los privilegios de ninguna manera, puede agregar transparencia explícitamente al ensamblado con el atributo siguiente: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]  

Si desea mezclar código transparente y crítico en el mismo ensamblado, empiece marcando el ensamblado con el atributo SecurityCriticalAttribute para indicar que el ensamblado puede contener código crítico, como se indica a continuación: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]  

Si desea realizar acciones críticas para la seguridad, debe marcar explícitamente el código que realizará la acción crítica con otro atributo SecurityCriticalAttribute, como se muestra en el ejemplo de código siguiente: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 */ }  
    }  
}  

El código anterior es transparente, excepto el método Critical, que se marca explícitamente como crítico para la seguridad.The previous code is transparent except for the Critical method, which is explicitly marked as security-critical. La transparencia es la configuración predeterminada, incluso con el atributo SecurityCriticalAttribute de nivel de ensamblado.Transparency is the default setting, even with the assembly-level SecurityCriticalAttribute attribute.

Vea tambiénSee also