Conceptos básicos sobre la seguridad de acceso del códigoCode Access Security Basics

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.

Todas las aplicaciones que tengan como destino Common Language Runtime (es decir, todas las aplicaciones administradas) deben interactuar con el sistema de seguridad del runtime.Every application that targets the common language runtime (that is, every managed application) must interact with the runtime's security system. Cuando se carga una aplicación administrada, su host le concede automáticamente un conjunto de permisos.When a managed application is loaded, its host automatically grants it a set of permissions. Estos permisos están determinados por la configuración de seguridad local del host o por el espacio aislado en el que se encuentra la aplicación.These permissions are determined by the host's local security settings or by the sandbox the application is in. En función de estos permisos, la aplicación se ejecutará correctamente o generará una excepción de seguridad.Depending on these permissions, the application either runs properly or generates a security exception.

El host predeterminado para las aplicaciones de escritorio permite que el código se ejecute con plena confianza.The default host for desktop applications allows code to run in full trust. Por lo tanto, si la aplicación tiene como destino el escritorio, tendrá un conjunto de permisos no restringido.Therefore, if your application targets the desktop, it has an unrestricted permission set. Otros hosts o espacios aislados proporcionan un conjunto de permisos limitado para las aplicaciones.Other hosts or sandboxes provide a limited permission set for applications. Dado que el conjunto de permisos puede cambiar de un host a otro, deberá diseñar la aplicación para que tan solo use los permisos que permite el host de destino.Because the permission set can change from host to host, you must design your application to use only the permissions that your target host allows.

Debe estar familiarizado con los siguientes conceptos de seguridad de acceso del código para escribir aplicaciones eficaces que tengan como destino Common Language Runtime:You must be familiar with the following code access security concepts in order to write effective applications that target the common language runtime:

  • Código de seguridad de tipos: código de seguridad de tipos es código que sólo obtiene acceso a tipos siguiendo métodos permitidos y bien definidos.Type-safe code: Type-safe code is code that accesses types only in well-defined, allowable ways. Por ejemplo, dada una referencia de objeto válido, el código con seguridad de tipos puede tener acceso a la memoria en desplazamientos fijos que se corresponden con miembros de campo reales.For example, given a valid object reference, type-safe code can access memory at fixed offsets that correspond to actual field members. El código no tiene seguridad de tipos si tiene acceso a la memoria en desplazamientos arbitrarios fuera del intervalo de memoria que pertenece a esos campos del objeto expuestos públicamente.If the code accesses memory at arbitrary offsets outside the range of memory that belongs to that object's publicly exposed fields, it is not type-safe. Para que el código pueda beneficiarse de la seguridad de acceso del código, use un compilador que genere código con seguridad de tipos comprobable.To enable code to benefit from code access security, you must use a compiler that generates verifiably type-safe code. Para obtener más información, consulte el escritura con seguridad de tipos de código comprobable sección más adelante en este tema.For more information, see the Writing Verifiably Type-Safe Code section later in this topic.

  • Sintaxis imperativa y declarativa: código destinado a common language runtime puede interactuar con el sistema de seguridad al solicitar permisos, exigir que los llamadores tengan los permisos especificados e invalidar ciertas (configuración de seguridad tiene suficientes privilegios concedidos).Imperative and declarative syntax: Code that targets the common language runtime can interact with the security system by requesting permissions, demanding that callers have specified permissions, and overriding certain security settings (given enough privileges). Para interactuar mediante programación con el sistema de seguridad de .NET Framework se usan dos formas de sintaxis: sintaxis declarativa y la sintaxis imperativa.You use two forms of syntax to programmatically interact with the .NET Framework security system: declarative syntax and imperative syntax. Las llamadas declarativas se realizan mediante atributos y las llamadas imperativas se realizan con nuevas instancias de clases dentro del código.Declarative calls are performed using attributes; imperative calls are performed using new instances of classes within your code. Hay llamadas que solo se pueden realizar de manera imperativa, otras solo de forma declarativa y algunas se pueden realizar de ambas maneras.Some calls can be performed only imperatively, others can be performed only declaratively, and some calls can be performed in either manner.

  • Bibliotecas de clases seguras: una biblioteca de clases seguras usa peticiones de seguridad para asegurarse de que los llamadores de la biblioteca tienen permiso para tener acceso a los recursos que expone la biblioteca.Secure class libraries: A secure class library uses security demands to ensure that the library's callers have permission to access the resources that the library exposes. Por ejemplo, una biblioteca de clases segura podría tener un método para crear archivos que requiera que los llamadores tengan permisos para crear archivos.For example, a secure class library might have a method for creating files that would demand that its callers have permissions to create files. .NET Framework consta de bibliotecas de clases seguras.The .NET Framework consists of secure class libraries. Debe tener en cuenta los permisos necesarios para el acceso a cualquier biblioteca que use el código.You should be aware of the permissions required to access any library that your code uses. Para obtener más información, consulte el usando bibliotecas de clases seguras sección más adelante en este tema.For more information, see the Using Secure Class Libraries section later in this topic.

  • El código transparente: a partir de la .NET Framework 4.NET Framework 4, además de identificar los permisos específicos, también debe determinar si el código debe ejecutarse como transparente en seguridad.Transparent code: Starting with the .NET Framework 4.NET Framework 4, in addition to identifying specific permissions, you must also determine whether your code should run as security-transparent. El código transparente en seguridad no puede llamar a tipos o miembros que se identifican como críticos para la seguridad.Security-transparent code cannot call types or members that are identified as security-critical. Esta regla se aplica a las aplicaciones de plena confianza y a las de confianza parcial.This rule applies to full-trust applications as well as partially trusted applications. Para obtener más información, consulte código transparente en seguridad.For more information, see Security-Transparent Code.

Escritura de código con seguridad de tipos comprobableWriting Verifiably Type-Safe Code

La compilación Just-In-Time (JIT) ejecuta un proceso de comprobación que examina el código e intenta determinar si el código tiene seguridad de tipos.Just-in-time (JIT) compilation performs a verification process that examines code and tries to determine whether the code is type-safe. Se llama al código que demuestra durante la comprobación de seguridad de tipos código de seguridad de tipos comprobable.Code that is proven during verification to be type-safe is called verifiably type-safe code. Es posible que el código tenga seguridad de tipos aunque no se pueda comprobar que sea así debido a las limitaciones del proceso de comprobación o del compilador.Code can be type-safe, yet might not be verifiably type-safe because of the limitations of the verification process or of the compiler. No todos los lenguajes tienen seguridad de tipos y algunos compiladores de lenguaje, como Microsoft Visual C++, no pueden generar código administrado con seguridad de tipos comprobable.Not all languages are type-safe, and some language compilers, such as Microsoft Visual C++, cannot generate verifiably type-safe managed code. Para determinar si su compilador de lenguaje genera código con seguridad de tipos comprobable, consulte la documentación del compilador.To determine whether the language compiler you use generates verifiably type-safe code, consult the compiler's documentation. Si usa un compilador de lenguaje que genera código con seguridad de tipos comprobable sólo cuando se evitan determinadas construcciones de lenguaje, puede usar el herramienta PEVerify para determinar si el código tiene seguridad de tipos comprobable.If you use a language compiler that generates verifiably type-safe code only when you avoid certain language constructs, you might want to use the PEVerify tool to determine whether your code is verifiably type-safe.

El código sin seguridad de tipos comprobable puede intentar ejecutarse si la directiva de seguridad permite al código omitir esta comprobación.Code that is not verifiably type-safe can attempt to execute if security policy allows the code to bypass verification. Sin embargo, dado que la seguridad de tipos es una parte esencial del mecanismo de runtime para aislar los ensamblados, la seguridad no se puede aplicar de forma confiable si el código infringe las reglas de seguridad de tipos.However, because type safety is an essential part of the runtime's mechanism for isolating assemblies, security cannot be reliably enforced if code violates the rules of type safety. De forma predeterminada, el código sin seguridad de tipos solo se puede ejecutar si se origina desde el equipo local.By default, code that is not type-safe is allowed to run only if it originates from the local computer. Por lo tanto, el código móvil debe tener seguridad de tipos.Therefore, mobile code should be type-safe.

Uso de bibliotecas de clases segurasUsing Secure Class Libraries

Si el código solicita y se le conceden los permisos requeridos por la biblioteca de clases, se le permitirá tener acceso a la biblioteca y los recursos que expone la biblioteca estarán protegidos frente a accesos no autorizados.If your code requests and is granted the permissions required by the class library, it will be allowed to access the library and the resources that the library exposes will be protected from unauthorized access. Si el código no tiene los permisos adecuados, no podrá tener acceso a la biblioteca de clases y el código malintencionado no podrá usar el código para obtener acceso indirectamente a los recursos protegidos.If your code does not have the appropriate permissions, it will not be allowed to access the class library, and malicious code will not be able to use your code to indirectly access protected resources. El resto de código que llame a su código también deber tener permiso de acceso a la biblioteca.Other code that calls your code must also have permission to access the library. Si no es así, su código tampoco podrá ejecutarse.If it does not, your code will be restricted from running as well.

Seguridad de acceso del código no elimina la posibilidad de que se produzcan errores humanos al escribir código.Code access security does not eliminate the possibility of human error in writing code. Sin embargo, si la aplicación usa bibliotecas de clases seguras para obtener acceso a recursos protegidos, se reduce el riesgo de seguridad para el código de la aplicación, ya que las bibliotecas de clases se examinan detenidamente para detectar posibles problemas de seguridad.However, if your application uses secure class libraries to access protected resources, the security risk for application code is decreased, because class libraries are closely scrutinized for potential security problems.

Seguridad declarativaDeclarative Security

Sintaxis de seguridad declarativa usa atributos para colocar la información de seguridad en el metadatos del código.Declarative security syntax uses attributes to place security information into the metadata of your code. Los atributos se pueden colocar en el nivel de ensamblado, clase o miembro para indicar el tipo de solicitud, petición o invalidación que desea usar.Attributes can be placed at the assembly, class, or member level, to indicate the type of request, demand, or override you want to use. Las solicitudes se usan en aplicaciones destinadas a Common Language Runtime para informar al sistema de seguridad de runtime sobre los permisos que la aplicación necesita o no desea.Requests are used in applications that target the common language runtime to inform the runtime security system about the permissions that your application needs or does not want. Las peticiones e invalidaciones se usan en las bibliotecas para ayudar a proteger los recursos de los llamadores o para invalidar el comportamiento de seguridad predeterminado.Demands and overrides are used in libraries to help protect resources from callers or to override default security behavior.

Nota

En .NET Framework 4.NET Framework 4se introdujeron cambios importantes tanto en el modelo de seguridad de .NET Framework como en la terminología.In the .NET Framework 4.NET Framework 4, there have been important changes to the .NET Framework security model and terminology. Para obtener más información sobre estos cambios, consulte cambios de seguridad.For more information about these changes, see Security Changes.

Para usar llamadas de seguridad declarativas, debe inicializar los datos de estado del objeto de permiso para que represente la forma concreta del permiso necesario.In order to use declarative security calls, you must initialize the state data of the permission object so that it represents the particular form of permission you need. Cada permiso integrado tiene un atributo al que se pasa una enumeración SecurityAction para describir el tipo de operación de seguridad que se desea realizar.Every built-in permission has an attribute that is passed a SecurityAction enumeration to describe the type of security operation you want to perform. Sin embargo, los permisos también aceptan parámetros propios exclusivos.However, permissions also accept their own parameters that are exclusive to them.

El siguiente fragmento de código muestra la sintaxis declarativa para solicitar que los llamadores del código tengan un permiso personalizado denominado MyPermission.The following code fragment shows declarative syntax for requesting that your code's callers have a custom permission called MyPermission. Este permiso es un permiso personalizado hipotético y no existe en .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. En este ejemplo, la llamada declarativa se coloca directamente antes de la definición de clase, lo que especifica que este permiso se aplica en el nivel de clase.In this example, the declarative call is placed directly before the class definition, specifying that this permission be applied to the class level. Se pasa al atributo una SecurityAction.Demand estructura para especificar que los llamadores deben tener este permiso para poder ejecutarse.The attribute is passed a SecurityAction.Demand structure to specify that callers must have this permission in order to run.

<MyPermission(SecurityAction.Demand, Unrestricted = True)> Public Class MyClass1  

   Public Sub New()  
      'The constructor is protected by the security call.  
   End Sub  

   Public Sub MyMethod()  
      'This method is protected by the security call.  
   End Sub  

   Public Sub YourMethod()  
      'This method is protected by the security call.  
   End Sub  
End Class  
[MyPermission(SecurityAction.Demand, Unrestricted = true)]  
public class MyClass  
{  
   public MyClass()  
   {  
      //The constructor is protected by the security call.  
   }  

   public void MyMethod()  
   {  
      //This method is protected by the security call.  
   }  

   public void YourMethod()  
   {  
      //This method is protected by the security call.  
   }  
}  

Seguridad imperativaImperative Security

La sintaxis de seguridad imperativa emite una llamada de seguridad mediante la creación de una nueva instancia del objeto de permiso que se desea invocar.Imperative security syntax issues a security call by creating a new instance of the permission object you want to invoke. La sintaxis imperativa se puede usar para realizar peticiones e invalidaciones, pero no solicitudes.You can use imperative syntax to perform demands and overrides, but not requests.

Antes de realizar la llamada de seguridad, debe inicializar los datos de estado del objeto de permiso para que represente la forma concreta del permiso necesario.Before you make the security call, you must initialize the state data of the permission object so that it represents the particular form of the permission you need. Por ejemplo, al crear un FileIOPermission objeto, puede utilizar el constructor para inicializar el FileIOPermission para que represente el acceso ilimitado a todos los archivos o ningún acceso a los archivos de objeto.For example, when creating a FileIOPermission object, you can use the constructor to initialize the FileIOPermission object so that it represents either unrestricted access to all files or no access to files. O bien, puede usar otro FileIOPermission objetos, pasar parámetros que indican el tipo de acceso que desea el objeto que represente (es decir, lectura, anexar o escritura) y qué archivos desea que el objeto proteja.Or, you can use a different FileIOPermission object, passing parameters that indicate the type of access you want the object to represent (that is, read, append, or write) and what files you want the object to protect.

Además de usar la sintaxis de seguridad imperativa para invocar un solo objeto de seguridad, puede usarlo para inicializar un grupo de permisos de un conjunto de permisos.In addition to using imperative security syntax to invoke a single security object, you can use it to initialize a group of permissions in a permission set. Por ejemplo, esta técnica es la única manera confiable de realizar assert llama en varios permisos en un método.For example, this technique is the only way to reliably perform assert calls on multiple permissions in one method. Use las clases PermissionSet y NamedPermissionSet para crear un grupo de permisos y, a continuación, llame al método apropiado para invocar la llamada de seguridad deseada.Use the PermissionSet and NamedPermissionSet classes to create a group of permissions and then call the appropriate method to invoke the desired security call.

La sintaxis imperativa se puede usar para realizar peticiones e invalidaciones, pero no solicitudes.You can use imperative syntax to perform demands and overrides, but not requests. Cuando la información que necesita para inicializar el estado de permiso solo se revela en tiempo de ejecución, puede usar la sintaxis imperativa para las peticiones e invalidaciones en lugar de la sintaxis declarativa.You might use imperative syntax for demands and overrides instead of declarative syntax when information that you need in order to initialize the permission state becomes known only at run time. Por ejemplo, si desea asegurarse de que los llamadores tienen permiso para leer un archivo determinado, pero no conoce el nombre de ese archivo hasta el tiempo de ejecución, use una petición imperativa.For example, if you want to ensure that callers have permission to read a certain file, but you do not know the name of that file until run time, use an imperative demand. También puede usar comprobaciones imperativas en lugar de comprobaciones declarativas cuando necesita determinar en tiempo de ejecución si una condición se mantiene y, en función del resultado de la prueba, realizar una petición de seguridad (o no).You might also choose to use imperative checks instead of declarative checks when you need to determine at run time whether a condition holds and, based on the result of the test, make a security demand (or not).

El siguiente fragmento de código muestra la sintaxis imperativa para solicitar que los llamadores del código tengan un permiso personalizado denominado MyPermission.The following code fragment shows imperative syntax for requesting that your code's callers have a custom permission called MyPermission. Este permiso es un permiso personalizado hipotético y no existe en .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. Una nueva instancia de MyPermision se crea en MyMethod, protegiendo solo este método con la llamada de seguridad.A new instance of MyPermision is created in MyMethod, guarding only this method with the security call.

Public Class MyClass1  

   Public Sub New()  

   End Sub  

   Public Sub MyMethod()  
      'MyPermission is demanded using imperative syntax.  
      Dim Perm As New MyPermission()  
      Perm.Demand()  
      'This method is protected by the security call.  
   End Sub  

   Public Sub YourMethod()  
      'YourMethod 'This method is not protected by the security call.  
   End Sub  
End Class  
public class MyClass {  
   public MyClass(){  

   }  

   public void MyMethod() {  
       //MyPermission is demanded using imperative syntax.  
       MyPermission Perm = new MyPermission();  
       Perm.Demand();  
       //This method is protected by the security call.  
   }  

   public void YourMethod() {  
       //This method is not protected by the security call.  
   }  
}  

Utilizar clases contenedoras administradasUsing Managed Wrapper Classes

La mayoría de las aplicaciones y los componentes (excepto las bibliotecas seguras) no deben llamar directamente a código no administrado.Most applications and components (except secure libraries) should not directly call unmanaged code. Hay varias razones para ello.There are several reasons for this. Si el código llama directamente a código no administrado, no podrá ejecutarse en muchas circunstancias porque el código debe disponer de un alto nivel de confianza para llamar a código nativo.If code calls unmanaged code directly, it will not be allowed to run in many circumstances because code must be granted a high level of trust to call native code. Si se modifica la directiva para permitir que esa aplicación se ejecute, ello podrá debilitar significativamente la seguridad del sistema, dando libertad a la aplicación para que realice prácticamente cualquier operación.If policy is modified to allow such an application to run, it can significantly weaken the security of the system, leaving the application free to perform almost any operation.

Además, el código que tiene permiso de acceso a código no administrado probablemente puede realizar casi cualquier operación mediante una llamada a una API no administrada.Additionally, code that has permission to access unmanaged code can probably perform almost any operation by calling into an unmanaged API. Por ejemplo, el código que tiene permiso para llamar a código no administrado no necesita FileIOPermission para tener acceso a un archivo; simplemente puede llamar a un archivo (Win32) no administrado API directamente, omitiendo la API que requiere de archivo administrada FileIOPermission.For example, code that has permission to call unmanaged code does not need FileIOPermission to access a file; it can just call an unmanaged (Win32) file API directly, bypassing the managed file API that requires FileIOPermission. Si el código administrado tiene permiso para llamar a código no administrado y llama directamente al código no administrado, el sistema de seguridad no podrá imponer restricciones de seguridad de manera confiable, ya que el runtime no puede aplicar dichas restricciones al código no administrado.If managed code has permission to call into unmanaged code and does call directly into unmanaged code, the security system will be unable to reliably enforce security restrictions, since the runtime cannot enforce such restrictions on unmanaged code.

Si desea que la aplicación realice una operación que requiere el acceso a código no administrado, deberá hacerlo a través de una clase administrada de confianza que encapsule la funcionalidad necesaria (si esta clase existe).If you want your application to perform an operation that requires accessing unmanaged code, it should do so through a trusted managed class that wraps the required functionality (if such a class exists). No cree una clase contenedora usted mismo si ya existe una en la biblioteca de clases seguras.Do not create a wrapper class yourself if one already exists in a secure class library. La clase contenedora, que debe tener un alto grado de confianza que le permita realizar la llamada a código no administrado, es responsable de exigir que sus llamadores tengan los permisos adecuados.The wrapper class, which must be granted a high degree of trust to be allowed to make the call into unmanaged code, is responsible for demanding that its callers have the appropriate permissions. Si usa la clase contenedora, el código solo necesita solicitar y recibir los permisos que requiere la clase contenedora.If you use the wrapper class, your code only needs to request and be granted the permissions that the wrapper class demands.

Vea tambiénSee Also

PermissionSet
FileIOPermission
NamedPermissionSet
SecurityAction
AssertAssert
Seguridad de acceso del códigoCode Access Security
Code Access Security Basics (Conceptos básicos sobre la seguridad de acceso del código)Code Access Security Basics
AtributosAttributes
Metadatos y componentes autodescriptivosMetadata and Self-Describing Components