リフレクションに関するセキュリティ上の考慮事項

更新 : 2007 年 11 月

リフレクションを利用して、型とメンバに関する情報を取得し、メンバにアクセスすることができます。非パブリックなメンバにアクセスすることで、セキュリティ リスクが生じる可能性があります。したがって、非パブリックなメンバにアクセスするコードでは、ReflectionPermission に適切なフラグを指定する必要があります。さらに、証拠の提供、アンマネージ コードの実行、オブジェクトのシリアル化などのタスクには、SecurityPermission が必要になります。

次のタスクは、アクセス許可がなくても、すべてのコードでリフレクションを使用して実行できます。

  • 型とメンバを列挙し、そのメタデータを確認する。

  • アセンブリとモジュールを列挙し、確認する。

  • パブリック メンバにアクセスする。

  • 呼び出し元コードの基本クラスの protected メンバにアクセスする (リフレクションの場合、これはファミリレベル アクセスと呼ばれます)。

  • 呼び出し元コードのアセンブリの internal メンバ (Visual Basic では Friend メンバ) にアクセスする (リフレクションの場合、これはアセンブリレベル アクセスと呼ばれます)。

非パブリック メンバへのアクセス

リフレクションを使用して、共通言語ランタイムのアクセシビリティ規則によりアクセスできないメンバを呼び出すには、次の 2 つのアクセス許可のどちらかをコードに許可する必要があります。

  • コードから非パブリック メンバを呼び出せるようにするには、ReflectionPermissionReflectionPermissionFlag.MemberAccess フラグを指定します。

    メモ :

    既定で、インターネットを起源とするコードにこのアクセス許可を与えることは、セキュリティ ポリシーによって禁じられています。インターネットを起源とするコードには、このアクセス許可を絶対に与えないでください。

  • 呼び出されるメンバが格納されているアセンブリの許可セットが、呼び出し元のコードが格納されているアセンブリの許可セットと同じか、またはそのサブセットである場合に限り、コードから非パブリック メンバを呼び出せるようにするには、ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess フラグを指定します。

たとえば、アプリケーション ドメインにインターネット アクセス許可を付与すると共に、ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess フラグを指定するとします。次に、A と B の 2 つのアセンブリを使用して、インターネット アプリケーションを実行します。

  • アセンブリ B の許可セットには、アセンブリ A に付与されていないアクセス許可が含まれていないため、アセンブリ A でリフレクションを使用してアセンブリ B のプライベート メンバにアクセスできます。

  • アセンブリ A ではリフレクションを使用して mscorlib.dll などの .NET Framework アセンブリのプライベート メンバにアクセスすることはできません。これは、mscorlib.dll が完全に信頼されており、アセンブリ A に付与されていないアクセス許可を持つためです。実行時にコード アクセス セキュリティによりスタックを走査すると、MemberAccessException がスローされます。

ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess フラグを指定することが許可されている、サンドボックス化されたアプリケーション ドメインの例については、「チュートリアル : 部分信頼シナリオにおけるコード出力」を参照してください。

シリアル化

シリアル化の目的で、SecurityPermissionSecurityPermissionAttribute.SerializationFormatter フラグを指定することで、アクセシビリティに関係なく、シリアル化が可能な型のメンバを取得および設定できるようになります。このアクセス許可があると、インスタンスのプライベート状態を探索したり、変更したりできます。型に対して適切なアクセス許可が与えられていると同時に、メタデータ内でシリアル化可能としてマークされている必要があります。

リンク確認要求チェック

メソッドまたはデリゲートが P アクセス許可に対する LinkDemand を持っている場合は、ランタイムはそのメソッドまたはデリゲートの呼び出し元に対してリンク確認要求チェックを実行して、リンク呼び出し元に P アクセス許可が付与されていることを確認します。このリンク確認要求チェックは、型情報の探索と呼び出しのために実行されます。

MethodInfo 型パラメータの作成の回避

特に、大きな権限を持つコードには、MethodInfo パラメータを受け取るパブリック API を記述しないでください。このような API は、悪意のあるコードの攻撃を受けやすい場合があります。たとえば、大きな権限を与えられたコード内で、MethodInfo パラメータを受け取るパブリック API の場合を考えてみましょう。このパブリック API が、渡されたパラメータに対して間接的に Invoke メソッドを呼び出すとします。パブリック API が必要なアクセス許可を確認しない場合、セキュリティ システムは呼び出し元が大きな権限を持っていると判断するため、その Invoke メソッド呼び出しは常に成功します。悪意のあるコードがそのメソッドを直接呼び出すアクセス許可を持っていなくても、パブリック API を呼び出すことによって間接的に Invoke メソッドを呼び出すことができます。

バージョン情報

ReflectionPermissionFlag.RestrictedMemberAccess フラグは、.NET Framework version 2.0 Service Pack 1 で導入されました。以前のバージョンの .NET Framework では、コードから非パブリック メンバにアクセスするには ReflectionPermissionFlag.MemberAccess フラグを指定する必要がありました。このアクセス許可は、部分的に信頼されるコードには絶対に付与しないでください。

メモ :

ReflectionPermissionFlag.RestrictedMemberAccess フラグを使用するには、アプリケーションで .NET Framework version 3.5 を対象とする必要があります。詳細については、「.NET Framework 3.5 のアーキテクチャ」を参照してください。

.NET Framework 2.0 以降から、リフレクションを使用して非パブリックな型とメンバに関する情報を取得する場合、アクセス許可が不要になりました。以前のバージョンでは、ReflectionPermissionReflectionPermissionFlag.TypeInformation フラグを指定する必要があります。

参照

概念

リフレクション出力のセキュリティ関連事項

型情報の表示

属性の適用

カスタム属性へのアクセス

参照

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission