リフレクション出力のセキュリティ関連事項Security Issues in Reflection Emit

.NET Framework には、Microsoft Intermediate Language (MSIL) を出力する方法が 3 種類ありますが、それぞれに固有のセキュリティ問題があります。The .NET Framework provides three ways to emit Microsoft intermediate language (MSIL), each with its own security issues:

動的コードの生成方法に関係なく、生成済みコードを実行するには、生成済みコードで使用される型やメソッドに必要なすべてのアクセス許可が必要です。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.

注意

コードでのリフレクションとコードの出力に必要なアクセス許可は、.NET Framework のリリースによって異なります。The permissions that are required for reflecting on code and emitting code have changed with succeeding releases of the .NET Framework. このトピックの「バージョン情報」をご覧ください。See Version Information, later in this topic.

動的アセンブリDynamic Assemblies

動的アセンブリを作成するには、AppDomain.DefineDynamicAssembly メソッドのオーバーロードを使用します。Dynamic assemblies are created by using overloads of the AppDomain.DefineDynamicAssembly method. コンピューター全体のセキュリティ ポリシーが削除されたため、このメソッドのほとんどのオーバーロードは .NET Framework 4 では推奨されていません。Most overloads of this method are deprecated in the .NET Framework 4, because of the elimination of machine-wide security policy. (「セキュリティの変更」を参照してください)。残りのオーバーロードは、信頼レベルに関係なく、任意のコードで実行できます。(See Security Changes.) The remaining overloads can be executed by any code, regardless of trust level. これらのオーバーロードは 2 つのグループに分けられます。1 つは、動的アセンブリの作成時に適用する属性の一覧を指定するグループで、もう 1 つは属性の一覧を指定しないグループです。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. アセンブリの透過性モデルを指定しない場合は、アセンブリの作成時に SecurityRulesAttribute 属性を適用することによって、出力アセンブリから透過性モデルが継承されます。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.

注意

SetCustomAttribute メソッドを使用すると、動的アセンブリの作成後に適用する属性は、そのアセンブリがディスクに保存され、メモリに再び読み込まれるまでは有効になりません。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.

動的アセンブリのコードからは、参照できる型と他のアセンブリのメンバーのみにアクセスできます。Code in a dynamic assembly can access visible types and members in other assemblies.

注意

動的アセンブリでは、動的メソッドが非パブリックな型とメンバーにアクセスすることを許可する ReflectionPermissionFlag.MemberAccess フラグと ReflectionPermissionFlag.RestrictedMemberAccess フラグが使用されません。Dynamic assemblies do not use the ReflectionPermissionFlag.MemberAccess and ReflectionPermissionFlag.RestrictedMemberAccess flags that allow dynamic methods to access nonpublic types and members.

一時動的アセンブリはメモリ内に作成され、ディスクに保存されることがないため、ファイルへのアクセス許可は不要です。Transient dynamic assemblies are created in memory and never saved to disk, so they require no file access permissions. 動的アセンブリをディスクに保存するには、FileIOPermission に適切なフラグを指定する必要があります。Saving a dynamic assembly to disk requires FileIOPermission with the appropriate flags.

部分信頼コードからの動的アセンブリの生成Generating Dynamic Assemblies from Partially Trusted Code

インターネット アクセス許可が設定されたアセンブリで一時動的アセンブリを生成し、そのコードを実行するための条件を考えてみましょう。Consider the conditions in which an assembly with Internet permissions can generate a transient dynamic assembly and execute its code:

  • 動的アセンブリで使用されるのが、パブリック型と他のアセンブリのメンバーのみである。The dynamic assembly uses only public types and members of other assemblies.

  • その型およびメンバーで必要なアクセス許可が、部分信頼のアセンブリの許可セットに含まれている。The permissions demanded by those types and members are included in the grant set of the partially trusted assembly.

  • アセンブリがディスクに保存されていない。The assembly is not saved to disk.

  • デバッグ シンボルが生成されていない。Debug symbols are not generated. (Internet および LocalIntranet のアクセス許可セットに必要なアクセス許可が指定されていない)(Internet and LocalIntranet permission sets do not include the necessary permissions.)

匿名でホストされる動的メソッドAnonymously Hosted Dynamic Methods

関連付けられる型やモジュールを指定しない 2 つの DynamicMethod コンストラクター (DynamicMethod(String, Type, Type[]) および 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). このコンストラクターにより、システムで指定された完全に信頼される透過的セキュリティ アセンブリに動的メソッドが置かれます。These constructors place the dynamic methods in a system-provided, fully trusted, security-transparent assembly. このコンストラクターの使用や動的メソッドのコード出力のために、特別なアクセス許可は必要ありません。No permissions are required to use these constructors or to emit code for the dynamic methods.

ただし、匿名でホストされる動的メソッドが作成されるとき、コール スタックがキャプチャされます。Instead, when an anonymously hosted dynamic method is created, the call stack is captured. メソッドの作成時に、キャプチャされたコール スタックに対してセキュリティ要求がなされます。When the method is constructed, security demands are made against the captured call stack.

注意

概念的には、メソッドの作成中に要求がなされます。Conceptually, demands are made during the construction of the method. つまり、MSIL 命令が生成されるたびに要求を実行できます。That is, demands could be made as each MSIL instruction is emitted. 現在の実装では、DynamicMethod.CreateDelegate メソッドが呼び出されたとき (CreateDelegate を呼び出さずにこのメソッドが呼び出される場合)、または Just-In-Time (JIT) コンパイラが呼び出されたときに、すべての要求がなされます。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.

アプリケーション ドメインで許可されている場合、匿名でホストされる動的メソッドでは、JIT の参照範囲チェックを省略できますが、制限があります。匿名でホストされる動的メソッドによりアクセスされる非パブリックの型とメンバーがアセンブリに含まれ、そのアセンブリの許可セットが、出力元のコール スタックの許可セットに等しいか、または、そのサブセットであることが必要です。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. アプリケーション ドメインで ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess フラグが指定されている場合は、この制限付き機能を使って JIT 参照範囲チェックを省略できます。This restricted ability to skip JIT visibility checks is enabled if the application domain grants ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

  • メソッドでパブリックな型とメンバーのみを使用する場合は、作成中にアクセス許可は不要です。If your method uses only public types and members, no permissions are required during construction.

  • JIT 参照範囲チェックを省略するように指定した場合、メソッドの作成時になされる要求には ReflectionPermissionFlag.RestrictedMemberAccess フラグが指定された ReflectionPermission と、アクセスされる非パブリック メンバーを含むアセンブリの許可セットが含まれます。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.

非パブリック メンバーの許可セットが考慮されるため、ReflectionPermissionFlag.RestrictedMemberAccess によって許可された部分信頼コードでは、信頼されるアセンブリの非パブリック メンバーを実行しても特権を昇格することができません。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.

他の出力済みコードと同じように、動的メソッドを実行するには、動的メソッドで使用されるメソッドで必要なアクセス許可がすべて必要になります。As with any other emitted code, executing the dynamic method requires whatever permissions are demanded by the methods the dynamic method uses.

匿名でホストされる動的メソッドをホストするシステム アセンブリでは、SecurityRuleSet.Level1 透過性モデルが使用されます。これは、.NET Framework 4 より前の .NET Framework で使用されていた透過性モデルです。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.

詳細については、DynamicMethod クラスを参照してください。For more information, see the DynamicMethod class.

部分的に信頼されるコードによる匿名でホストされる動的メソッドの生成Generating Anonymously Hosted Dynamic Methods from Partially Trusted Code

インターネット アクセス許可が設定されたアセンブリで、匿名でホストされる動的メソッドを生成し、それを実行するための条件を考えてみましょう。Consider the conditions in which an assembly with Internet permissions can generate an anonymously hosted dynamic method and execute it:

  • 動的メソッドで使用されるのが、パブリックな型とメンバーのみである。The dynamic method uses only public types and members. 許可セットに ReflectionPermissionFlag.RestrictedMemberAccess が含まれる場合、許可セットが出力元アセンブリの許可セットと同じか、またはそのサブセットであるアセンブリの非パブリックの型とメンバーを使用できます。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.

  • 動的メソッドで使用されるすべての型およびメンバーで必要なアクセス許可が、部分信頼のアセンブリの許可セットに含まれている。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.

注意

動的メソッドではデバッグ シンボルがサポートされていません。Dynamic methods do not support debug symbols.

既存のアセンブリに関連付けられている動的メソッドDynamic Methods Associated with Existing Assemblies

動的メソッドに既存アセンブリの型またはモジュールを関連付けるには、関連付ける型またはモジュールを指定する DynamicMethod コンストラクターのどれかを使用します。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. 動的メソッドに既存の型またはモジュールを関連付けると、動的メソッドが非パブリックの型とメンバーにアクセスできるようになるため、これらのコンストラクターを呼び出すにはアクセス許可が必要です。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:

  • 型に関連付けられる動的メソッドは、その型のすべてのメンバー (プライベート メンバーを含む) にアクセスでき、関連付けられた型が含まれるアセンブリ内部のすべての型およびメンバーにアクセスできます。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.

  • モジュールに関連付けられる動的メソッドは、モジュールのすべての internal 型およびメンバー (Visual Basic では Friend、共通言語ランタイムのメタデータでは assembly) にアクセスできます。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.

さらに、JIT コンパイラの参照範囲チェックを省略する機能を指定するコンストラクターを使用できます。In addition, you can use a constructor that specifies the ability to skip the visibility checks of the JIT compiler. これを使用した場合、アクセス レベルに関係なく、動的メソッドからすべてのアセンブリのすべての型およびメンバーにアクセスできます。Doing so gives your dynamic method access to all types and members in all assemblies, regardless of access level.

コンストラクターで必要なアクセス許可は、動的メソッドに与えるアクセス許可のレベルに応じて決まります。The permissions demanded by the constructor depend on how much access you decide to give your dynamic method:

この一覧の項目は出力アセンブリの許可セットの観点から書かれていますが、要求はコール スタック全体 (アプリケーション ドメイン境界を含む) に対してなされることに注意してください。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.

詳細については、DynamicMethod クラスを参照してください。For more information, see the DynamicMethod class.

部分信頼コードからの動的メソッドの生成Generating Dynamic Methods from Partially Trusted Code

注意

部分的に信頼されるコードから動的メソッドを生成する方法として推奨されるのは、匿名でホストされる動的メソッドを使用する方法です。The recommended way to generate dynamic methods from partially trusted code is to use anonymously hosted dynamic methods.

インターネット アクセス許可が設定されたアセンブリで、動的メソッドを生成し、それを実行するための条件を考えてみましょう。Consider the conditions in which an assembly with Internet permissions can generate a dynamic method and execute it:

  • 動的メソッドにそれを出力するモジュールまたは型が関連付けられているか、その許可セットに ReflectionPermissionFlag.RestrictedMemberAccess が含まれている。さらに、関連付けられているモジュールが含まれているアセンブリの許可セットが出力アセンブリの許可セットと等しいか、そのサブセットである。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.

  • 動的メソッドで使用されるのが、パブリックな型とメンバーのみである。The dynamic method uses only public types and members. 許可セットに ReflectionPermissionFlag.RestrictedMemberAccess が含まれ、関連付けられているモジュールが含まれているアセンブリの許可セットが出力アセンブリの許可セットと等しいか、そのサブセットである場合、その関連モジュールの中で internal と指定されている (Visual Basic では Friend、共通言語ランタイム メタデータでは assembly) 型とメンバーを使用できます。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.

  • 動的メソッドで使用されるすべての型およびメンバーで必要なアクセス許可が、部分信頼のアセンブリの許可セットに含まれている。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.

  • 動的メソッドで JIT 参照範囲チェックを省略しない。The dynamic method does not skip JIT visibility checks.

注意

動的メソッドではデバッグ シンボルがサポートされていません。Dynamic methods do not support debug symbols.

バージョン情報Version Information

.NET Framework 4 以降では、コンピューター全体のセキュリティ ポリシーが削除され、セキュリティ透過性が既定の適用機構になりました。Starting with the .NET Framework 4, machine-wide security policy is eliminated and security transparency becomes the default enforcement mechanism. セキュリティの変更」をご覧ください。See Security Changes.

.NET Framework 2.0 Service Pack 1 以降では、動的アセンブリと動的メソッドを出力するときに、ReflectionPermissionReflectionPermissionFlag.ReflectionEmit フラグを指定する必要がなくなりました。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. このフラグは、それ以前のすべてのバージョンの .NET Framework では必要となります。This flag is required in all earlier versions of the .NET Framework.

注意

FullTrust および LocalIntranet の名前付きアクセス許可セットでは、既定で ReflectionPermissionReflectionPermissionFlag.ReflectionEmit フラグが指定されますが、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. そのため、以前のバージョンの .NET Framework では、ReflectionEmit に対して Assert を実行する場合にのみ、インターネット アクセス許可でライブラリを使用できます。Therefore, in earlier versions of the .NET Framework, a library can be used with Internet permissions only if it executes an Assert for ReflectionEmit. このようなライブラリでは、コーディング エラーがあるとセキュリティ ホールが発生するおそれがあるため、セキュリティを慎重にレビューする必要があります。Such libraries require careful security review because coding errors could result in security holes. コードの生成は本質的に特権を必要とする操作ではないため、.NET Framework 2.0 SP1 はセキュリティ確認要求を発行せずに部分信頼シナリオでコードを出力できます。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. これは、生成されたコードには、コードを出力したアセンブリと同等以下のアクセス許可しかないことを意味します。That is, the generated code has no more permissions than the assembly that emits it. これにより、コードを出力するライブラリは透過的セキュリティになるため、ReflectionEmit を要求する必要がなくなります。そのため、安全なライブラリを簡単に作成できるようになります。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.

さらに、.NET Framework 2.0 SP1 では部分的に信頼される動的メソッドの非パブリックの型およびメンバーにアクセスできるように、ReflectionPermissionFlag.RestrictedMemberAccess フラグが導入されています。In addition, the .NET Framework 2.0 SP1 introduces the ReflectionPermissionFlag.RestrictedMemberAccess flag for accessing nonpublic types and members from partially trusted dynamic methods. 以前のバージョンの .NET Framework では、動的メソッドで非パブリックの型およびメンバーにアクセスするには ReflectionPermissionFlag.MemberAccess フラグが必要でした。これは、部分信頼のコードには付与されないアクセス許可です。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.

最終的に、.NET Framework 2.0 SP1 では、匿名でホストされるメソッドが導入されました。Finally, the .NET Framework 2.0 SP1 introduces anonymously hosted methods.

型およびメンバーの情報の取得Obtaining Information on Types and Members

.NET Framework 2.0 以降から、非パブリックな型とメンバーに関する情報を取得する際にアクセス許可は不要になりました。Starting with the .NET Framework 2.0, no permissions are required to obtain information about nonpublic types and members. 動的メソッドを出力するために必要な情報を取得するには、リフレクションを使用します。Reflection is used to obtain information needed to emit dynamic methods. たとえば、MethodInfo オブジェクトを使用してメソッド呼び出しを出力します。For example, MethodInfo objects are used to emit method calls. 以前のバージョンの .NET Framework では、ReflectionPermissionReflectionPermissionFlag.TypeInformation フラグを指定する必要があります。Earlier versions of the .NET Framework require ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag. 詳しくは、「リフレクションに関するセキュリティ上の考慮事項」をご覧ください。For more information, see Security Considerations for Reflection.

関連項目See also