.NET Framework リモート処理での自動逆シリアル化
このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。
実行時の型検証に依存しているリモート処理システムでは、リモート ストリームの使用を始めるときに逆シリアル化が必要です。この逆シリアル化の際に、認証されていないクライアントからの攻撃を受ける可能性があります。この種類の攻撃からの保護を支援するため、.NET Framework リモート処理では、Low と Full の 2 つの自動逆シリアル化のレベルが用意されています。Low (既定値) は、最も基本的なリモート処理機能に対応する型だけを逆シリアル化することによって、逆シリアル化攻撃を防ぎます。たとえば、リモート処理インフラストラクチャの型、システム実装の型の一部、基本的なカスタム型などが、自動逆シリアル化されます。Full レベルは、リモート処理が各種の状況でサポートするすべての型の自動逆シリアル化をサポートします。
注意 : |
---|
アプリケーションに必要なセキュリティは、逆シリアル化の制御だけではありません。分散アプリケーションでは、シリアル化を高度に制御している場合でも、認証されていないクライアントが通信を傍受し、他人に公開するなどしてデータを使用するのを防ぐことはできません。このため、逆シリアル化のレベルを Low にすることによって、自動逆シリアル化に基づいた特定の種類の攻撃を防ぐことはできますが、認証や暗号化を使用してデータを保護するべきかどうかを検討する必要があります。詳細については、「セキュリティ」を参照してください。 |
ここでは、.NET Framework リモート処理の逆シリアル化レベルについて説明します。
Low (既定のレベル)
.NET Framework リモート処理の既定の逆シリアル化レベルでは、次の型の逆シリアル化がサポートされています。
リモート処理インフラストラクチャ オブジェクト。これらは、リモート処理を基本的なレベルで機能させるために必要な型です。
プリミティブ型、およびプリミティブ型で構成されている参照型と値型。
SerializableAttribute 属性でマークされており、ISerializable インターフェイスを実装しない参照型と値型。
システムによって提供され、ISerializable を実装し、シリアル化以外は何も要求しない型。
厳密な名前を持ち、AllowPartiallyTrustedCallersAttribute 属性でマークされていないアセンブリにあるカスタム型。
ISerializable を実装し、シリアル化以外は何も要求しないカスタム型。
ILease インターフェイスを実装し、MarshalByRefObject オブジェクトではない型。
クライアント側でアクティブ化されるオブジェクトをサポートするために、アクティベーションで使用される ObjRef オブジェクト。クライアントは返された ObjRef の逆シリアル化を実行できますが、サーバーは実行できません。
Full
.NET Framework リモート処理の逆シリアル化レベル Full は、以下に示す追加の型の逆シリアル化を含む、その他のシナリオすべてをサポートします。
パラメーターとして渡された ObjRef オブジェクト。
ISponsor インターフェイスを実装するオブジェクト。
IContributeEnvoySink インターフェイスにより、プロキシとクライアント パイプラインの間に挿入されたオブジェクト。
パラメーターとして渡されるデリゲート型。
パラメーターとして渡される MarshalByRefObject から継承されるオブジェクト。
パラメーターとして渡される ISerializable 型。
GAC に格納され、AllowPartiallyTrustedCallersAttribute 属性でマークされていない型。
アプリケーションが、逆シリアル化レベルを Full にしないと使用できないリモート処理機能を必要とする場合に、危険にさらされる可能性のあるリソースを保護するには、リモート処理でこれらの高度な機能を使用することにより、必要な認証の種類と暗号化のレベルを指定する必要があります。
逆シリアル化レベルは、プログラムによって設定することも、アプリケーションの構成ファイルで設定することもできます。
プログラムによる逆シリアル化レベルの設定
プログラムによって逆シリアル化レベルを設定するには、SoapServerFormatterSinkProvider オブジェクトまたは BinaryServerFormatterSinkProvider オブジェクトを作成するときに、次のプロパティを渡します。リモート処理システムは、フォーマッタがシンク チェインに挿入されるときに、フォーマッタに値を設定します。ホスト アプリケーション ドメインで逆シリアル化レベルを Full に設定する例を次に示します。
// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 8085;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel chan = new TcpChannel(props, null, provider);
' Creating a custom formatter for your TcpChannel sink chain.
Dim provider As New BinaryServerFormatterSinkProvider()
provider.TypeFilterLevel = TypeFilterLevel.Full
' Creating the IDictionary to set the port on the channel instance.
Dim props As IDictionary = New Hashtable()
props("port") = 8085
' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
Dim chan As New TcpChannel(props, DBNull.Value, provider)
アプリケーション構成ファイルによる逆シリアル化レベルの設定
構成ファイルを使用して逆シリアル化レベルを設定するには、<formatter> 要素の typeFilterLevel 属性を明示的に指定する必要があります。通常、この指定はサーバー側で行いますが、コールバックをリッスンするように登録されたクライアントでは、そのチャネルの逆シリアル化レベルを制御するために、この属性も指定する必要があります。アプリケーション ドメインで、SoapFormatter と BinaryFormatter の両方に対して、逆シリアル化のレベルを明示的に Low に設定する例を次に示します。
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
type="ServiceType, common"
objectUri="ServiceType.soap"
mode="Singleton"
/>
</service>
<channels>
<channel ref="http">
<serverProviders>
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel=Low />
<formatter ref="binary" typeFilterLevel=Low />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
参照
リファレンス
RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel