Problemi di sicurezza nella reflection emitSecurity Issues in Reflection Emit

.NET Framework.NET Framework fornisce tre modalità per creare codice Microsoft Intermediate Language (MSIL), ciascuna con specifici problemi di sicurezza:The .NET Framework.NET Framework provides three ways to emit Microsoft intermediate language (MSIL), each with its own security issues:

Indipendentemente dalla modalità di generazione del codice dinamico, l'esecuzione del codice generato richiede tutte le autorizzazioni necessarie per i tipi e i metodi usati dal codice generato.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.

Nota

Le autorizzazioni necessarie per la reflection sul codice e sul codice di creazione sono state modificate nelle versioni successive di .NET Framework.NET Framework.The permissions that are required for reflecting on code and emitting code have changed with succeeding releases of the .NET Framework.NET Framework. Vedere Informazioni sulla versione più avanti in questo argomento.See Version Information, later in this topic.

Assembly dinamiciDynamic Assemblies

Gli assembly dinamici vengono creati usando gli overload del metodo AppDomain.DefineDynamicAssembly.Dynamic assemblies are created by using overloads of the AppDomain.DefineDynamicAssembly method. La maggior parte degli overload di questo metodo sono deprecati in .NET Framework 4.NET Framework 4 a causa dell'eliminazione dei criteri di sicurezza a livello di computer.Most overloads of this method are deprecated in the .NET Framework 4.NET Framework 4, because of the elimination of machine-wide security policy. Vedere Modifiche di sicurezza. Gli overload rimanenti possono essere eseguiti da qualsiasi codice, indipendentemente dal livello di attendibilità.(See Security Changes.) The remaining overloads can be executed by any code, regardless of trust level. Questi overload rientrano in due gruppi: quelli che specificano un elenco di attributi da applicare all'assembly dinamico quando viene creato e quelli che non lo specificano.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. Se non si specifica il modello di trasparenza per l'assembly, applicando l'attributo SecurityRulesAttribute durante la creazione, il modello di trasparenza viene ereditato dall'assembly di creazione.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.

Nota

Gli attributi applicati all'assembly dinamico dopo averlo creato mediante il metodo SetCustomAttribute non sono effettivi fino a quando l'assembly non viene salvato su disco e caricato di nuovo in memoria.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.

Il codice in un assembly dinamico può accedere a tipi e membri visibili in altri assembly.Code in a dynamic assembly can access visible types and members in other assemblies.

Nota

Gli assembly dinamici non usano i flag ReflectionPermissionFlag.MemberAccess e ReflectionPermissionFlag.RestrictedMemberAccess che consentono ai metodi dinamici di accedere a tipi e membri non pubblici.Dynamic assemblies do not use the ReflectionPermissionFlag.MemberAccess and ReflectionPermissionFlag.RestrictedMemberAccess flags that allow dynamic methods to access nonpublic types and members.

Gli assembly dinamici temporanei vengono creati in memoria e non vengono mai salvati su disco, pertanto non richiedono alcuna autorizzazione di accesso ai file.Transient dynamic assemblies are created in memory and never saved to disk, so they require no file access permissions. Il salvataggio di un assembly dinamico su disco richiede FileIOPermission con flag appropriati.Saving a dynamic assembly to disk requires FileIOPermission with the appropriate flags.

Generazione di assembly dinamici da codice parzialmente attendibileGenerating Dynamic Assemblies from Partially Trusted Code

Considerare le condizioni in cui un assembly con autorizzazioni Internet può generare un assembly dinamico temporaneo ed eseguirne il codice:Consider the conditions in which an assembly with Internet permissions can generate a transient dynamic assembly and execute its code:

  • L'assembly dinamico usa solo tipi e membri pubblici di altri assembly.The dynamic assembly uses only public types and members of other assemblies.

  • Le autorizzazioni richieste da questi tipi e membri sono incluse nel set di concessioni dell'assembly parzialmente attendibile.The permissions demanded by those types and members are included in the grant set of the partially trusted assembly.

  • L'assembly non viene salvato su disco.The assembly is not saved to disk.

  • I simboli di debug non vengono generati.Debug symbols are not generated. I set di autorizzazioni Internet e LocalIntranet non includono le autorizzazioni necessarie.(Internet and LocalIntranet permission sets do not include the necessary permissions.)

Metodi dinamici ospitati anonimamenteAnonymously Hosted Dynamic Methods

I metodi dinamici ospitati anonimamente vengono creati usando i due costruttori DynamicMethod che non specificano un tipo o un modulo associato, DynamicMethod(String, Type, Type[]) e 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). Questi costruttori inseriscono i metodi dinamici in un assembly fornito dal sistema, completamente attendibile, trasparente per la sicurezza.These constructors place the dynamic methods in a system-provided, fully trusted, security-transparent assembly. Non sono necessarie autorizzazioni per usare questi costruttori o per generare il codice per i metodi dinamici.No permissions are required to use these constructors or to emit code for the dynamic methods.

Al contrario, quando viene creato un metodo dinamico ospitato anonimamente, viene acquisito lo stack di chiamate.Instead, when an anonymously hosted dynamic method is created, the call stack is captured. Quando il metodo viene costruito, le richieste di sicurezza vengono effettuate sullo stack di chiamate acquisito.When the method is constructed, security demands are made against the captured call stack.

Nota

Concettualmente, le richieste vengono effettuate durante la costruzione del metodo.Conceptually, demands are made during the construction of the method. In altre parole, le richieste potrebbero essere effettuate durante la creazione delle singole istruzioni MSIL.That is, demands could be made as each MSIL instruction is emitted. Nell'implementazione corrente tutte le richieste vengono effettuate quando il metodo DynamicMethod.CreateDelegate viene chiamato o quando viene richiamato il compilatore Just-In-Time (JIT), se il metodo viene richiamato senza chiamare 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.

Se il dominio applicazione lo consente, i metodi dinamici ospitati anonimamente possono ignorare i controlli di visibilità JIT, ma solo se viene rispettata la restrizione seguente: i tipi e i membri non pubblici a cui accede un metodo dinamico ospitato anonimamente devono trovarsi in assembly i cui set di concessioni sono uguali o sono subset del set di concessioni dello stack di chiamate di creazione.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. Questa possibilità limitata di ignorare i controlli di visibilità JIT viene abilitata se il dominio applicazione concede ReflectionPermission con il flag ReflectionPermissionFlag.RestrictedMemberAccess.This restricted ability to skip JIT visibility checks is enabled if the application domain grants ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

  • Se il metodo usa solo tipi e membri pubblici, non sono necessarie autorizzazioni durante la costruzione.If your method uses only public types and members, no permissions are required during construction.

  • Se si specifica che i controlli di visibilità JIT debbano essere ignorati, la richiesta effettuata durante la costruzione del metodo includerà ReflectionPermission con il flag ReflectionPermissionFlag.RestrictedMemberAccess e il set di concessioni dell'assembly che contiene il membro non pubblico a cui si accede.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.

Poiché il set di concessioni del membro non pubblico viene preso in considerazione, il codice parzialmente attendibile che ha ottenuto ReflectionPermissionFlag.RestrictedMemberAccess non può elevare i privilegi eseguendo membri non pubblici di assembly attendibili.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.

Come con qualsiasi altro codice generato, l'esecuzione del metodo dinamico richiede le autorizzazioni obbligatorie per i metodi usate dal metodo dinamico.As with any other emitted code, executing the dynamic method requires whatever permissions are demanded by the methods the dynamic method uses.

L'assembly di sistema che ospita i metodi dinamici ospitati anonimamente usa il modello di trasparenza SecurityRuleSet.Level1, usato in .NET Framework prima di .NET Framework 4.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.NET Framework 4.

Per altre informazioni, vedere la classe DynamicMethod.For more information, see the DynamicMethod class.

Generazione di metodi dinamici ospitati anonimamente dal codice parzialmente attendibileGenerating Anonymously Hosted Dynamic Methods from Partially Trusted Code

Considerare le condizioni in cui un assembly con autorizzazioni Internet può generare un metodo dinamico ospitato anonimamente ed eseguirlo:Consider the conditions in which an assembly with Internet permissions can generate an anonymously hosted dynamic method and execute it:

  • Il metodo dinamico usa solo tipi e membri pubblici.The dynamic method uses only public types and members. Se il set di concessioni include ReflectionPermissionFlag.RestrictedMemberAccess, è possibile usare i tipi e i membri non pubblici di qualsiasi assembly il cui set di concessioni sia uguale o sia un subset del set di concessioni dell'assembly di creazione.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.

  • Le autorizzazioni necessarie per tutti i tipi e i membri usati dal metodo dinamico sono incluse nel set di concessioni dell'assembly parzialmente attendibile.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.

Nota

I metodi dinamici non supportano i simboli di debug.Dynamic methods do not support debug symbols.

Metodi dinamici associati ad assembly esistentiDynamic Methods Associated with Existing Assemblies

Per associare un metodo dinamico a un tipo o a un modulo in un assembly esistente, usare uno qualsiasi dei costruttori DynamicMethod che specificano il tipo o il modulo associato.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. Le autorizzazioni necessarie per chiamare questi costruttori variano, poiché l'associazione di un metodo dinamico a un tipo o a un modulo esistente fornisce al metodo dinamico l'accesso ai membri e ai tipi non pubblici: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:

  • Un metodo dinamico associato a un tipo può accedere a tutti i membri di tale tipo, anche ai membri privati, e a tutti i tipi e membri interni nell'assembly che contiene il tipo associato.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.

  • Un metodo dinamico associato a un modulo può accedere a tutti i tipi e membri di internal (Friend in Visual Basic, assembly nei metadati di Common Language Runtime) nel modulo.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.

Inoltre, è possibile usare un costruttore che consente di specificare la possibilità di ignorare i controlli di visibilità del compilatore JIT.In addition, you can use a constructor that specifies the ability to skip the visibility checks of the JIT compiler. In questo modo il metodo dinamico può accedere a tutti i tipi e membri in tutti gli assembly, indipendentemente dal livello di accesso.Doing so gives your dynamic method access to all types and members in all assemblies, regardless of access level.

Le autorizzazioni richieste dal costruttore dipendono dal livello di accesso che si decide di concedere al metodo dinamico:The permissions demanded by the constructor depend on how much access you decide to give your dynamic method:

Anche se gli elementi nell'elenco vengono descritti in termini di set di concessioni dell'assembly, tenere presente che le richieste vengono effettuate sullo stack di chiamate completo, incluso il limite del dominio applicazione.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.

Per altre informazioni, vedere la classe DynamicMethod.For more information, see the DynamicMethod class.

Generazione di metodi dinamici dal codice parzialmente attendibileGenerating Dynamic Methods from Partially Trusted Code

Nota

Il metodo consigliato per generare metodi dinamici dal codice parzialmente attendibile consiste nell'usare metodi dinamici ospitati anonimamente.The recommended way to generate dynamic methods from partially trusted code is to use anonymously hosted dynamic methods.

Considerare le condizioni in cui un assembly con autorizzazioni Internet può generare un metodo dinamico ed eseguirlo:Consider the conditions in which an assembly with Internet permissions can generate a dynamic method and execute it:

  • Il metodo dinamico è associato al modulo o al tipo che lo genera oppure il set di concessioni include ReflectionPermissionFlag.RestrictedMemberAccess ed è associato a un modulo in un assembly il cui set di concessioni è uguale o è un subset del set di concessioni dell'assembly di creazione.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.

  • Il metodo dinamico usa solo tipi e membri pubblici.The dynamic method uses only public types and members. Se il set di concessioni include ReflectionPermissionFlag.RestrictedMemberAccess ed è associato a un modulo in un assembly il cui set di concessioni è uguale o è un subset del set di concessioni dell'assembly di creazione, può usare tipi e membri contrassegnati come internal (Friend in Visual Basic, assembly nei metadati di Common Language Runtime) nel modulo associato.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.

  • Le autorizzazioni richieste da tutti i tipi e i membri usati dal metodo dinamico sono inclusi nel set di concessioni dell'assembly parzialmente attendibile.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.

  • Il metodo dinamico non ignora i controlli di visibilità JIT.The dynamic method does not skip JIT visibility checks.

Nota

I metodi dinamici non supportano i simboli di debug.Dynamic methods do not support debug symbols.

Informazioni sulla versioneVersion Information

A partire da .NET Framework 4.NET Framework 4, i criteri di sicurezza a livello di computer vengono eliminati e la trasparenza della sicurezza diventa il meccanismo di imposizione predefinito.Starting with the .NET Framework 4.NET Framework 4, machine-wide security policy is eliminated and security transparency becomes the default enforcement mechanism. Vedere Modifiche di sicurezza.See Security Changes.

A partire da .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1, non è più necessario usare ReflectionPermission con il flag ReflectionPermissionFlag.ReflectionEmit quando si generano assembly e metodi dinamici.Starting with the .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1, ReflectionPermission with the ReflectionPermissionFlag.ReflectionEmit flag is no longer required when emitting dynamic assemblies and dynamic methods. Questo flag è richiesto in tutte le versioni precedenti di .NET Framework.NET Framework.This flag is required in all earlier versions of the .NET Framework.NET Framework.

Nota

ReflectionPermission con il flag ReflectionPermissionFlag.ReflectionEmit viene incluso per impostazione predefinita nei set di autorizzazioni denominati FullTrust e LocalIntranet, ma non nel set di autorizzazioni 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. Pertanto, nelle versioni precedenti di .NET Framework.NET Framework, è possibile usare una libreria con autorizzazioni Internet solo se viene eseguito un Assert per ReflectionEmit.Therefore, in earlier versions of the .NET Framework.NET Framework, a library can be used with Internet permissions only if it executes an Assert for ReflectionEmit. Tali librerie richiedono un'attenta revisione della sicurezza perché eventuali errori nel codice potrebbe produrre delle vulnerabilità.Such libraries require careful security review because coding errors could result in security holes. .NET Framework 2.0 SP1.NET Framework 2.0 SP1 consente di generare codice in scenari con attendibilità parziale senza creare alcuna richiesta di sicurezza, poiché la generazione di codice non è implicitamente un'operazione con privilegi.The .NET Framework 2.0 SP1.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. Ovvero, il codice generato non dispone di ulteriori autorizzazioni rispetto all'assembly che lo genera.That is, the generated code has no more permissions than the assembly that emits it. Questo consente alle librerie che generano il codice di essere SecurityTransparent ed elimina la necessità di asserire ReflectionEmit, che semplifica l'attività di scrittura di una libreria protetta.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.

Inoltre, .NET Framework 2.0 SP1.NET Framework 2.0 SP1 introduce il flag ReflectionPermissionFlag.RestrictedMemberAccess per l'accesso a tipi e membri non pubblici da metodi dinamici parzialmente attendibili.In addition, the .NET Framework 2.0 SP1.NET Framework 2.0 SP1 introduces the ReflectionPermissionFlag.RestrictedMemberAccess flag for accessing nonpublic types and members from partially trusted dynamic methods. Le versioni precedenti di .NET Framework.NET Framework richiedono il flag ReflectionPermissionFlag.MemberAccess per i metodi dinamici che accedono a membri e tipi non pubblici; si tratta di un'autorizzazione che non dovrebbe mai essere concessa a codice parzialmente attendibile.Earlier versions of the .NET Framework.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.

Infine, .NET Framework 2.0 SP1.NET Framework 2.0 SP1 introduce i metodi ospitati anonimamente.Finally, the .NET Framework 2.0 SP1.NET Framework 2.0 SP1 introduces anonymously hosted methods.

Informazioni su tipi e membriObtaining Information on Types and Members

A partire da .NET Framework 2.0.NET Framework 2.0 non sono necessarie autorizzazioni per ottenere informazioni sui tipi e i membri non pubblici.Starting with the .NET Framework 2.0.NET Framework 2.0, no permissions are required to obtain information about nonpublic types and members. Per ottenere le informazioni necessarie a generare metodi dinamici viene usato Reflection.Reflection is used to obtain information needed to emit dynamic methods. Ad esempio, gli oggetti MethodInfo vengono usati per generare le chiamate al metodo.For example, MethodInfo objects are used to emit method calls. Le versioni precedenti di .NET Framework.NET Framework richiedono ReflectionPermission con il flag ReflectionPermissionFlag.TypeInformation.Earlier versions of the .NET Framework.NET Framework require ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag. Per altre informazioni, vedere Security Considerations for Reflection (Considerazioni sulla sicurezza per reflection).For more information, see Security Considerations for Reflection.

Vedere ancheSee Also

Security Considerations for Reflection (Considerazioni sulla sicurezza per reflection)Security Considerations for Reflection
Creazione di assembly e metodi dinamiciEmitting Dynamic Methods and Assemblies