Problèmes de sécurité dans l'émission de réflexionSecurity Issues in Reflection Emit

Le .NET Framework offre trois façons d’émettre du code MSIL (Microsoft Intermediate Language), chacune avec ses propres problèmes de sécurité :The .NET Framework provides three ways to emit Microsoft intermediate language (MSIL), each with its own security issues:

Quelle que soit la façon dont vous générez le code dynamique, l'exécution du code généré nécessite toutes les autorisations requises par les types et par les méthodes utilisées par le code généré.Regardless of the way you generate dynamic code, executing the generated code requires all the permissions that are required by the types and methods the generated code uses.

Notes

Les autorisations nécessaires pour la réflexion sur le code et pour l’émission de code ont changé avec les versions successives du .NET Framework.The permissions that are required for reflecting on code and emitting code have changed with succeeding releases of the .NET Framework. Consultez Informations sur la version plus loin dans cette rubrique.See Version Information, later in this topic.

Assemblys dynamiquesDynamic Assemblies

Les assemblys dynamiques sont créés à l'aide de surcharges de la méthode AppDomain.DefineDynamicAssembly.Dynamic assemblies are created by using overloads of the AppDomain.DefineDynamicAssembly method. La plupart des surcharges de cette méthode sont dépréciées dans .NET Framework 4, en raison de la suppression de la stratégie de sécurité à l’échelle de l’ordinateur.Most overloads of this method are deprecated in the .NET Framework 4, because of the elimination of machine-wide security policy. (Voir modifications de sécurité.) Les surcharges restantes peuvent être exécutées par n’importe quel code, quel que soit le niveau de confiance.(See Security Changes.) The remaining overloads can be executed by any code, regardless of trust level. Ces surcharges sont réparties en deux groupes : celles qui spécifient une liste d'attributs à appliquer à l'assembly dynamique lors de sa création, et celles qui ne les spécifient pas.These overloads fall into two groups: those that specify a list of attributes to apply to the dynamic assembly when it is created, and those that do not. Si vous ne spécifiez pas le modèle de transparence pour l’assembly, en appliquant l’attribut SecurityRulesAttribute au moment de sa création, le modèle de transparence est hérité de l’assembly émetteur.If you do not specify the transparency model for the assembly, by applying the SecurityRulesAttribute attribute when you create it, the transparency model is inherited from the emitting assembly.

Notes

Les attributs que vous appliquez à l'assembly dynamique après sa création, en utilisant la méthode SetCustomAttribute, ne prennent pas effet tant que l'assembly n'a pas été enregistré sur le disque et rechargé en mémoire.Attributes that you apply to the dynamic assembly after it is created, by using the SetCustomAttribute method, do not take effect until the assembly has been saved to disk and loaded into memory again.

Le code d'un assembly dynamique peut accéder aux types et aux membres visibles d'autres assemblys.Code in a dynamic assembly can access visible types and members in other assemblies.

Notes

Les assemblys dynamiques n'utilisent pas les indicateurs ReflectionPermissionFlag.MemberAccess et ReflectionPermissionFlag.RestrictedMemberAccess, qui permettent aux méthodes dynamiques d'accéder aux types et aux membres non publics.Dynamic assemblies do not use the ReflectionPermissionFlag.MemberAccess and ReflectionPermissionFlag.RestrictedMemberAccess flags that allow dynamic methods to access nonpublic types and members.

Les assemblys dynamiques transitoires sont créés en mémoire et ne sont jamais enregistrés sur disque : ils ne nécessitent donc pas d'autorisations d'accès à des fichiers.Transient dynamic assemblies are created in memory and never saved to disk, so they require no file access permissions. L'enregistrement d'un assembly dynamique sur disque requiert FileIOPermission avec les indicateurs appropriés.Saving a dynamic assembly to disk requires FileIOPermission with the appropriate flags.

Génération d'assemblys dynamiques à partir de code d'un niveau de confiance partielGenerating Dynamic Assemblies from Partially Trusted Code

Considérez les conditions dans lesquelles un assembly disposant d'autorisations Internet peut générer un assembly dynamique transitoire et exécuter son code :Consider the conditions in which an assembly with Internet permissions can generate a transient dynamic assembly and execute its code:

  • L'assembly dynamique utilise seulement des types et des membres publics d'autres assemblys.The dynamic assembly uses only public types and members of other assemblies.

  • Les autorisations demandées par ces types et ces membres sont incluses dans le jeu d'autorisations de l'assembly partiellement approuvé.The permissions demanded by those types and members are included in the grant set of the partially trusted assembly.

  • L'assembly n'est pas enregistré sur disque.The assembly is not saved to disk.

  • Les symboles de débogage ne sont pas générés.Debug symbols are not generated. (Les jeux d'autorisations Internet et LocalIntranet n'incluent pas les autorisations nécessaires.)(Internet and LocalIntranet permission sets do not include the necessary permissions.)

Méthodes dynamiques hébergées anonymementAnonymously Hosted Dynamic Methods

Les méthodes dynamiques hébergées anonymement sont créées à l'aide des deux constructeurs de DynamicMethod qui ne spécifient pas un type ou un module associé, DynamicMethod(String, Type, Type[]) et DynamicMethod(String, Type, Type[], Boolean).Anonymously hosted dynamic methods are created by using the two DynamicMethod constructors that do not specify an associated type or module, DynamicMethod(String, Type, Type[]) and DynamicMethod(String, Type, Type[], Boolean). Ces constructeurs placent les méthodes dynamiques dans un assembly fourni par le système, entièrement fiable et transparent quant à la sécurité.These constructors place the dynamic methods in a system-provided, fully trusted, security-transparent assembly. Aucune autorisation n'est requise pour utiliser ces constructeurs ou pour émettre du code pour les méthodes dynamiques.No permissions are required to use these constructors or to emit code for the dynamic methods.

Au lieu de cela, quand une méthode dynamique hébergée anonymement est créée, la pile des appels est capturée.Instead, when an anonymously hosted dynamic method is created, the call stack is captured. Quand la méthode est construite, les demandes en matière de sécurité sont effectuées sur la pile des appels capturée.When the method is constructed, security demands are made against the captured call stack.

Notes

Conceptuellement, les demandes sont effectuées pendant la construction de la méthode.Conceptually, demands are made during the construction of the method. Autrement dit, les demandes peuvent être faites à l'émission de chaque instruction MSIL.That is, demands could be made as each MSIL instruction is emitted. Dans l'implémentation actuelle, toutes les demandes sont faites quand la méthode DynamicMethod.CreateDelegate est appelée ou quand le compilateur juste-à-temps (JIT) est appelé, si la méthode est appelée sans appel de CreateDelegate.In the current implementation, all demands are made when the DynamicMethod.CreateDelegate method is called or when the just-in-time (JIT) compiler is invoked, if the method is invoked without calling CreateDelegate.

Si le domaine d'application le permet, les méthodes dynamiques hébergées anonymement peuvent ignorer les contrôles de visibilité JIT, avec la restriction suivante : les types et les membres non publics auxquels accède une méthode dynamique hébergée anonymement doivent être dans des assemblys dont les jeux d'autorisations doivent être équivalents à ou être des sous-ensembles du jeu d'autorisations de la pile des appels émettrice.If the application domain permits it, anonymously hosted dynamic methods can skip JIT visibility checks, subject to the following restriction: The nonpublic types and members accessed by an anonymously hosted dynamic method must be in assemblies whose grant sets are equal to, or subsets of, the grant set of the emitting call stack. Cette possibilité restreinte d'ignorer les contrôles de visibilité JIT est activée si le domaine d'application accorde l'autorisation ReflectionPermission avec l'indicateur ReflectionPermissionFlag.RestrictedMemberAccess.This restricted ability to skip JIT visibility checks is enabled if the application domain grants ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

  • Si votre méthode utilise seulement des types et des membres publics, aucune autorisation n'est requise pendant la construction.If your method uses only public types and members, no permissions are required during construction.

  • Si vous spécifiez que les contrôles de visibilité JIT doivent être ignorés, la demande qui est faite quand la méthode est construite inclut ReflectionPermission avec l'indicateur ReflectionPermissionFlag.RestrictedMemberAccess et le jeu d'autorisations de l'assembly qui contient le membre non public qui fait l'objet de l'accès.If you specify that JIT visibility checks should be skipped, the demand that is made when the method is constructed includes ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and the grant set of the assembly that contains the nonpublic member that is being accessed.

Étant donné que le jeu d'autorisations du membre non public est pris en considération, le code d'un niveau de confiance partiel auquel l'autorisation ReflectionPermissionFlag.RestrictedMemberAccess a été accordée ne peut pas élever ses privilèges en exécutant des membres non publics d'assemblys approuvés.Because the grant set of the nonpublic member is taken into consideration, partially trusted code that has been granted ReflectionPermissionFlag.RestrictedMemberAccess cannot elevate its privileges by executing nonpublic members of trusted assemblies.

Comme avec tout autre code émis, l'exécution de la méthode dynamique nécessite toutes les autorisations demandées par les méthodes utilisées par la méthode dynamique.As with any other emitted code, executing the dynamic method requires whatever permissions are demanded by the methods the dynamic method uses.

L’assembly système qui héberge des méthodes dynamiques hébergées anonymement utilise le modèle de transparence SecurityRuleSet.Level1, qui est le modèle de transparence utilisé dans le .NET Framework avant .NET Framework 4.The system assembly that hosts anonymously-hosted dynamic methods uses the SecurityRuleSet.Level1 transparency model, which is the transparency model that was used in the .NET Framework before the .NET Framework 4.

Pour plus d'informations, consultez la classe DynamicMethod.For more information, see the DynamicMethod class.

Génération de méthodes dynamiques hébergées anonymement à partir de code d'un niveau de confiance partielGenerating Anonymously Hosted Dynamic Methods from Partially Trusted Code

Considérez les conditions dans lesquelles un assembly disposant d'autorisations Internet peut générer une méthode dynamique hébergée anonymement et l'exécuter :Consider the conditions in which an assembly with Internet permissions can generate an anonymously hosted dynamic method and execute it:

  • La méthode dynamique utilise seulement des types et des membres publics.The dynamic method uses only public types and members. Si son jeu d'autorisations inclut ReflectionPermissionFlag.RestrictedMemberAccess, elle peut utiliser des types et des membres non publics de tout assembly dont le jeu d'autorisations est équivalent à ou est un sous-ensemble du jeu d'autorisations de l'assembly émetteur.If its grant set includes ReflectionPermissionFlag.RestrictedMemberAccess, it can use nonpublic types and members of any assembly whose grant set is equal to, or a subset of, the grant set of the emitting assembly.

  • Les autorisations requises par tous les types et les membres utilisés par la méthode dynamique sont incluses dans le jeu d'autorisations de l'assembly partiellement approuvé.The permissions that are required by all the types and members used by the dynamic method are included in the grant set of the partially trusted assembly.

Notes

Les méthodes dynamiques ne prennent pas en charge les symboles de débogage.Dynamic methods do not support debug symbols.

Méthodes dynamiques associées à des assemblys existantsDynamic Methods Associated with Existing Assemblies

Pour associer une méthode dynamique à un type ou un module d'un assembly existant, utilisez les constructeurs de DynamicMethod qui spécifient le type ou le module associé.To associate a dynamic method with a type or module in an existing assembly, use any of the DynamicMethod constructors that specify the associated type or module. Les autorisations requises pour appeler ces constructeurs varient, car l'association d'une méthode dynamique à un type ou un module existant donne à la méthode dynamique l'accès aux types et aux membres non publics :The permissions that are required to call these constructors vary, because associating a dynamic method with an existing type or module gives the dynamic method access to nonpublic types and members:

  • Une méthode dynamique qui est associée à un type a accès à tous les membres de ce type, même aux membres privés, et à tous les types et les membres internes de l'assembly qui contient le type associé.A dynamic method that is associated with a type has access to all members of that type, even private members, and to all internal types and members in the assembly that contains the associated type.

  • Une méthode dynamique qui est associée à un module a accès à tous les types et les membres internal (Friend en Visual Basic, assembly dans les métadonnées du common language runtime) du module.A dynamic method that is associated with a module has access to all the internal types and members (Friend in Visual Basic, assembly in common language runtime metadata) in the module.

En outre, vous pouvez utiliser un constructeur qui spécifie la possibilité d'ignorer les contrôles de visibilité du compilateur JIT.In addition, you can use a constructor that specifies the ability to skip the visibility checks of the JIT compiler. Procéder ainsi donne à votre méthode dynamique l'accès à tous les types et membres de tous les assemblys, quel que soit le niveau d'accès.Doing so gives your dynamic method access to all types and members in all assemblies, regardless of access level.

Les autorisations demandées par le constructeur dépendent du niveau d'accès que vous décidez de donner à votre méthode dynamique :The permissions demanded by the constructor depend on how much access you decide to give your dynamic method:

Bien que les éléments de cette liste soient décrits en les termes du jeu d'autorisations de l'assembly émetteur, n'oubliez pas que les demandes sont faites sur la pile des appels complète, y compris la limite du domaine de l'application.Although the items in this list are described in terms of the grant set of the emitting assembly, remember that the demands are made against the full call stack, including the application domain boundary.

Pour plus d'informations, consultez la classe DynamicMethod.For more information, see the DynamicMethod class.

Génération de méthodes dynamiques à partir de code d'un niveau de confiance partielGenerating Dynamic Methods from Partially Trusted Code

Notes

La méthode recommandée pour générer des méthodes dynamiques à partir de code d’un niveau de confiance partiel consiste à utiliser des méthodes dynamiques hébergées anonymement.The recommended way to generate dynamic methods from partially trusted code is to use anonymously hosted dynamic methods.

Considérez les conditions dans lesquelles un assembly disposant d'autorisations Internet peut générer une méthode dynamique et l'exécuter :Consider the conditions in which an assembly with Internet permissions can generate a dynamic method and execute it:

  • La méthode dynamique est associée au module ou au type qui l'émet, ou bien son jeu d'autorisations inclut ReflectionPermissionFlag.RestrictedMemberAccess et elle est associée à un module d'un assembly dont le jeu d'autorisations est équivalent à ou est un sous-ensemble du jeu d'autorisations de l'assembly émetteur.Either the dynamic method is associated with the module or type that emits it, or its grant set includes ReflectionPermissionFlag.RestrictedMemberAccess and it is associated with a module in an assembly whose grant set is equal to, or a subset of, the grant set of the emitting assembly.

  • La méthode dynamique utilise seulement des types et des membres publics.The dynamic method uses only public types and members. Si son jeu d'autorisations inclut ReflectionPermissionFlag.RestrictedMemberAccess et qu'elle est associée à un module d'un assembly dont le jeu d'autorisations est équivalent à ou est un sous-ensemble du jeu d'autorisations de l'assembly émetteur, elle peut utiliser les types et les membres marqués comme étant internal (Friend en Visual Basic, assembly dans les métadonnées du common language runtime) dans le module associé.If its grant set includes ReflectionPermissionFlag.RestrictedMemberAccess and it is associated with a module in an assembly whose grant set is equal to, or a subset of, the grant set of the emitting assembly, it can use types and members marked internal (Friend in Visual Basic, assembly in common language runtime metadata) in the associated module.

  • Les autorisations demandées par tous les types et les membres utilisés par la méthode dynamique sont incluses dans le jeu d'autorisations de l'assembly partiellement approuvé.The permissions demanded by all the types and members used by the dynamic method are included in the grant set of the partially trusted assembly.

  • La méthode dynamique n'ignore pas les contrôles de visibilité JIT.The dynamic method does not skip JIT visibility checks.

Notes

Les méthodes dynamiques ne prennent pas en charge les symboles de débogage.Dynamic methods do not support debug symbols.

Informations sur la versionVersion Information

À compter de .NET Framework 4, la stratégie de sécurité à l’échelle de l’ordinateur est supprimée et la transparence de sécurité devient le mécanisme d’application par défaut.Starting with the .NET Framework 4, machine-wide security policy is eliminated and security transparency becomes the default enforcement mechanism. Consultez Changements en matière de sécurité.See Security Changes.

À compter de .NET Framework 2.0 Service Pack 1, ReflectionPermission avec l’indicateur ReflectionPermissionFlag.ReflectionEmit n’est plus nécessaire lors de l’émission d’assemblys et de méthodes dynamiques.Starting with the .NET Framework 2.0 Service Pack 1, ReflectionPermission with the ReflectionPermissionFlag.ReflectionEmit flag is no longer required when emitting dynamic assemblies and dynamic methods. Cet indicateur est nécessaire dans toutes les versions antérieures du .NET Framework.This flag is required in all earlier versions of the .NET Framework.

Notes

ReflectionPermission avec l'indicateur ReflectionPermissionFlag.ReflectionEmit est inclus par défaut dans les jeux d'autorisations nommés FullTrust et LocalIntranet, mais pas dans le jeu d'autorisations Internet.ReflectionPermission with the ReflectionPermissionFlag.ReflectionEmit flag is included by default in the FullTrust and LocalIntranet named permission sets, but not in the Internet permission set. Par conséquent, dans les versions antérieures du .NET Framework, une bibliothèque peut être utilisée avec des autorisations Internet uniquement si elle exécute une méthode Assert pour ReflectionEmit.Therefore, in earlier versions of the .NET Framework, a library can be used with Internet permissions only if it executes an Assert for ReflectionEmit. Ces bibliothèques nécessitent une revue minutieuse de la sécurité, car les erreurs de codage peuvent entraîner des failles de sécurité.Such libraries require careful security review because coding errors could result in security holes. .NET Framework 2.0 SP1 permet au code d’être émis dans des scénarios de confiance partielle sans émettre de demandes de sécurité, car la génération de code n’est pas fondamentalement une opération nécessitant des privilèges.The .NET Framework 2.0 SP1 allows code to be emitted in partial trust scenarios without issuing any security demands, because generating code is not inherently a privileged operation. Autrement dit, le code généré n'a pas plus d'autorisations que l'assembly qui l'émet.That is, the generated code has no more permissions than the assembly that emits it. Ceci permet aux bibliothèques qui émettent du code d'être transparentes de sécurité et supprime la nécessité de déclarer ReflectionEmit, ce qui simplifie l'écriture d'une bibliothèque sécurisée.This allows libraries that emit code to be security transparent and removes the need to assert ReflectionEmit, which simplifies the task of writing a secure library.

En outre, .NET Framework 2.0 SP1 introduit l’indicateur ReflectionPermissionFlag.RestrictedMemberAccess pour accéder aux types et aux membres non publics à partir de méthodes dynamiques partiellement approuvées.In addition, the .NET Framework 2.0 SP1 introduces the ReflectionPermissionFlag.RestrictedMemberAccess flag for accessing nonpublic types and members from partially trusted dynamic methods. Les versions antérieures du .NET Framework exigent l’indicateur ReflectionPermissionFlag.MemberAccess pour les méthodes dynamiques qui accèdent à des types et des membres non publics. Il s’agit d’une autorisation qui ne doit jamais être accordée à du code partiellement fiable.Earlier versions of the .NET Framework require the ReflectionPermissionFlag.MemberAccess flag for dynamic methods that access nonpublic types and members; this is a permission that should never be granted to partially trusted code.

Pour finir, .NET Framework 2.0 SP1 introduit des méthodes hébergées anonymement.Finally, the .NET Framework 2.0 SP1 introduces anonymously hosted methods.

Obtention d'informations sur les types et les membresObtaining Information on Types and Members

Depuis .NET Framework 2.0, aucune autorisation n’est nécessaire pour obtenir des informations sur les types et les membres non publics.Starting with the .NET Framework 2.0, no permissions are required to obtain information about nonpublic types and members. La réflexion est utilisée pour obtenir les informations nécessaires à l'émission de méthodes dynamiques.Reflection is used to obtain information needed to emit dynamic methods. Par exemple, les objets MethodInfo sont utilisés pour émettre des appels de méthode.For example, MethodInfo objects are used to emit method calls. Les versions antérieures du .NET Framework exigent ReflectionPermission avec l’indicateur ReflectionPermissionFlag.TypeInformation.Earlier versions of the .NET Framework require ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag. Pour plus d’informations, consultez Considérations relatives à la sécurité de la réflexion.For more information, see Security Considerations for Reflection.

Voir aussiSee also