Compartir a través de


Consideraciones de seguridad sobre la reflexión

La reflexión proporciona la capacidad de obtener información sobre los tipos y miembros, y de tener acceso a los miembros (es decir, llamar a métodos y constructores, obtener y establecer valores de propiedad, agregar y quitar controladores de eventos, etc.). El uso de la reflexión para obtener información sobre los tipos y miembros no está restringido. Todo el código puede utilizar la reflexión para realizar las siguientes tareas:

  • Enumerar tipos y miembros y examinar sus metadatos.

  • Enumerar y examinar ensamblados y módulos.

Utilizar la reflexión para tener acceso a los miembros, en cambio, sí está sujeto a restricciones. A partir de .NET Framework versión 4, solo el código de confianza puede usar la reflexión para tener acceso a miembros críticos para la seguridad. Además, solo el código de confianza puede usar la reflexión para tener acceso a miembros no públicos que no serían accesibles directamente para el código compilado. Por último, el código que usa la reflexión para tener acceso a un miembro crítico para la seguridad debe tener los permisos que necesite el miembro crítico para la seguridad, como el código compilado.

Supeditado a los permisos necesarios, el código puede utilizar la reflexión para realizar los siguientes tipos de acceso:

  • Acceso a miembros públicos que no son críticos para la seguridad.

  • Acceso a miembros no públicos que estarían accesibles para el código compilado, si esos miembros no son críticos para la seguridad. Algunos ejemplos de estos miembros no públicos son:

    • Miembros protegidos de las clases base del código de llamada. (En reflexión, esto se conoce como acceso de nivel familiar).

    • Miembros internal (miembros Friend en Visual Basic) del ensamblado del código de llamada. (En reflexión, esto se conoce como acceso de nivel de ensamblado).

    • Miembros privados de otras instancias de la clase que contiene el código de llamada.

Por ejemplo, el código que se ejecuta en un dominio de aplicación en espacio aislado se limita al acceso descrito en esta lista, a menos que el dominio de aplicación conceda permisos adicionales.

A partir de .NET Framework versión 2.0 Service Pack 1, al intentar tener acceso a miembros que normalmente no están accesibles, se genera una demanda del conjunto de permisos concedidos del objeto de destino más ReflectionPermission con la marca ReflectionPermissionFlag.MemberAccess. El código que se ejecuta con plena confianza (por ejemplo, el código de una aplicación que se inicia desde la línea de comandos) siempre puede satisfacer estos permisos. (Esto está sujeto a las limitaciones de acceso a los miembros críticos para la seguridad, tal y como se describe más adelante en este artículo.)

Opcionalmente, un dominio de aplicación en espacio aislado puede conceder permisos ReflectionPermission con la marca ReflectionPermissionFlag.MemberAccess, tal y como se describe en la sección Tener acceso a miembros que no suelen estar accesibles, más adelante en este artículo.

Tener acceso a miembros críticos para la seguridad

Un miembro es crítico para la seguridad si tiene SecurityCriticalAttribute, si pertenece a un tipo que tiene SecurityCriticalAttribute, o si se encuentra en un ensamblado crítico para la seguridad. A partir de .NET Framework versión 4, las reglas para tener acceso a los miembros críticos para la seguridad son las siguientes:

  • El código transparente no puede utilizar la reflexión para tener acceso a los miembros críticos para la seguridad, aunque el código sea de plena confianza. Se produce una excepción MethodAccessException, FieldAccessException o TypeAccessException.

  • El código que se ejecuta con confianza parcial se trata como si fuera transparente.

Estas reglas son las mismas con independencia de si se tiene acceso al miembro crítico para la seguridad directamente desde el código compilado o mediante la reflexión.

El código de aplicación que se ejecuta desde la línea de comandos se ejecuta con plena confianza. Siempre que no esté marcado como transparente, puede utilizar la reflexión para tener acceso a los miembros críticos para la seguridad. Cuando el mismo código se ejecuta con confianza parcial (por ejemplo, en un dominio de aplicación en espacio aislado), el nivel de confianza del ensamblado determina si se puede tener acceso al código crítico para la seguridad: si el ensamblado tiene un nombre seguro y se instala en la memoria caché global de ensamblados, es un ensamblado de confianza y puede llamar a los miembros críticos para la seguridad. Si no es de confianza, se vuelve transparente aunque no esté marcado como tal y no podrá tener acceso a los miembros críticos para la seguridad.

Para obtener más información acerca del modelo de seguridad de .NET Framework 4, vea Cambios de seguridad en .NET Framework 4.

Reflexión y transparencia

A partir de .NET Framework 4, el Common Language Runtime determina el nivel de transparencia de un tipo o miembro conforme a varios factores, incluido el nivel de confianza del ensamblado y el nivel de confianza del dominio de aplicación. La reflexión proporciona las propiedades IsSecurityCritical, IsSecuritySafeCritical y IsSecurityTransparent para permitirle detectar el nivel de transparencia de un tipo. En la siguiente tabla se muestran las combinaciones válidas de estas propiedades.

Nivel de seguridad

IsSecurityCritical

IsSecuritySafeCritical

IsSecurityTransparent

Crítica

true

false

false

Crítico para la seguridad

true

true

false

Transparente

false

false

true

Usar estas propiedades es mucho más fácil que examinar las anotaciones de seguridad de un ensamblado y sus tipos, comprobar el nivel de confianza actual e intentar duplicar las reglas del runtime. Por ejemplo, el mismo tipo puede ser crítico para la seguridad cuando se ejecuta desde la línea de comandos, o transparente en seguridad cuando se ejecuta en un dominio de aplicación en espacio aislado.

Hay propiedades similares en las clases MethodBase, FieldInfo, TypeBuilder, MethodBuilder y DynamicMethod. (Para obtener otras reflexiones y abstracciones de emisiones de reflexión, se aplican atributos de seguridad a los métodos asociados; por ejemplo, en el caso de las propiedades se aplican a los descriptores de acceso de propiedad.)

Tener acceso a miembros que no suelen estar accesibles

Si desea utilizar la reflexión para invocar miembros a los que no se puede tener acceso conforme a las reglas de accesibilidad de Common Language Runtime, el código debe disponer de uno de estos dos permisos:

  • Para permitir que el código invoque miembros no públicos: se debe conceder el permiso ReflectionPermission al código con la marca ReflectionPermissionFlag.MemberAccess.

    NotaNota

    De forma predeterminada, la directiva de seguridad deniega este permiso al código que se origina en Internet.Este permiso nunca debería concederse al código que se origina en Internet.

  • Para permitir que el código invoque miembros no públicos, siempre y cuando el conjunto de permisos concedidos del ensamblado que contiene el miembro invocado sea igual que el conjunto de permisos concedidos del ensamblado que contiene el código que se invoca (o un subconjunto de éste): se debe conceder el permiso ReflectionPermission al código con la marca ReflectionPermissionFlag.RestrictedMemberAccess.

Por ejemplo, suponga que concede a un dominio de aplicación permisos de Internet además de permisos ReflectionPermission con el marcador ReflectionPermissionFlag.RestrictedMemberAccess y, a continuación, ejecuta una aplicación de Internet con dos ensamblados, A y B.

  • El ensamblado A puede utilizar la reflexión para tener acceso a los miembros privados del ensamblado B, ya que el conjunto de permisos concedidos del ensamblado B no contiene ningún permiso que no se le haya concedido a A.

  • El ensamblado A no puede utilizar la reflexión para tener acceso a los miembros privados de los ensamblados de .NET Framework, por ejemplo mscorlib.dll, porque mscorlib.dll es de plena confianza y, por tanto, tiene permisos que no se le han concedido al ensamblado A. Se produce una excepción MemberAccessException cuando la seguridad de acceso del código recorre la pila en tiempo de ejecución.

Serialización

En la serialización, el permiso SecurityPermission con el marcador SecurityPermissionAttribute.SerializationFormatter proporciona la capacidad de obtener y establecer miembros de tipos serializables, sin tener en cuenta la accesibilidad. Este permiso permite al código detectar y cambiar el estado privado de una instancia. (Además de tener concedidos los permisos apropiados, se debe marcar el tipo como serializable en los metadatos).

Parámetros del tipo MethodInfo

Hay que evitar escribir miembros públicos que tomen parámetros MethodInfo, especialmente en el código de confianza. Estos miembros podrían ser más vulnerables al código malintencionado. Por ejemplo, imagine un miembro público en un código de plena confianza que tome un parámetro MethodInfo. Suponga que el miembro público llama indirectamente al método Invoke en el parámetro proporcionado. Si el miembro público no realiza las comprobaciones de permisos necesarias, la llamada al método Invoke se realizará siempre correctamente, ya que el sistema de seguridad determina que el llamador es de plena confianza. Incluso si hay código malintencionado sin permiso para invocar directamente al método, lo podrá hacer indirectamente llamando al miembro público.

Información de versiones

  • A partir de .NET Framework versión 4, el código transparente no puede utilizar la reflexión para tener acceso a los miembros críticos para la seguridad.

  • El marcador ReflectionPermissionFlag.RestrictedMemberAccess se incluye en .NET Framework versión 2.0 Service Pack 1. Las versiones anteriores de .NET Framework necesitan el marcador ReflectionPermissionFlag.MemberAccess en el código que utiliza la reflexión para tener acceso a los miembros no públicos. Éste es un permiso que nunca debe concederse al código de confianza parcial.

  • A partir de .NET Framework 2.0, ya no es necesario ningún permiso cuando se utiliza la reflexión para obtener información de tipos y miembros no públicos. En versiones anteriores, se necesitaba el permiso ReflectionPermission con el marcador ReflectionPermissionFlag.TypeInformation.

Vea también

Referencia

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission

Conceptos

Cambios de seguridad en .NET Framework 4

Seguridad de acceso del código

Problemas de seguridad en la emisión de la reflexión

Ver información de tipos

Aplicar atributos

Acceso a atributos personalizados