.NET リモート処理での自動逆シリアル化
実行時の型検証に依存しているリモート処理は、リモート ストリームを使い始めるときに逆シリアル化が必要です。この逆シリアル化の際に、認証されていないクライアントからの攻撃を受ける可能性があります。この種類の攻撃を防ぐことを支援するために、.NET リモート処理には、Low と Full の 2 つの自動逆シリアル化のレベルが用意されています。Low (既定値) は、最も基本的なリモート処理機能に対応する型だけを逆シリアル化することによって、逆シリアル化攻撃を防ぎます。たとえば、リモート処理インフラストラクチャの型、システム実装の一部の型、基本的なカスタム型などが、自動逆シリアル化されます。Full レベルの方は、リモート処理が各種の状況でサポートするすべての型の自動逆シリアル化をサポートします。
注意 アプリケーションに必要なセキュリティは、逆シリアル化の制御だけではありません。分散アプリケーションでは、シリアル化を高度に制御しても、認証されていないクライアントが通信を傍受し、そのデータを使用する (たとえば、他人に表示する) のを防ぐことはできません。このため、逆シリアル化レベルを Low にすることによって、自動逆シリアル化を利用した攻撃をある程度防ぐことはできるとしても、データの保護を支援するために、認証と暗号化の使用を検討する必要があります。詳細については、「セキュリティ」を参照してください。
.NET リモート処理の逆シリアル化レベルについて、以下で説明します。
Low (既定レベル)
.NET リモート処理の既定の逆シリアル化レベルでは、次の型の逆シリアル化がサポートされています。
- リモート処理インフラストラクチャ オブジェクト。これらは、リモート処理を基本的なレベルで機能させるために必要な型です。
- プリミティブ型、およびプリミティブ型で構成されている参照型と値型。
- SerializableAttribute 属性でマークされていて、ISerializable インターフェイスを実装しない参照型と値型。
- システムによって提供され、ISerializable を実装し、シリアル化以外では何も要求しない型。
- システムによって提供され、ISerializable を実装しているか、または SerializableAttribute 属性でマークされ、AllowPartiallyTrustedCallersAttribute 属性でマークされていないアセンブリにある型。
- 厳密な名前を持ち、AllowPartiallyTrustedCallersAttribute 属性でマークされていないアセンブリにあるカスタム型。
- ISerializable を実装し、シリアル化以外では何も要求しないカスタム型。
- ILease インターフェイスを実装し、MarshalByRefObject オブジェクトではない型。
- クライアント側でアクティブ化されるオブジェクトをサポートするために、アクティベーションで使用される ObjRef オブジェクト。このため、クライアントは返された ObjRef をシリアル化できますが、サーバーはできません。
Full
.NET リモート処理の逆シリアル化レベル Full は、以下の型の逆シリアル化を含む、すべてのシナリオをサポートします。
- パラメータとして渡された ObjRef オブジェクト。
- ISponsor インターフェイスを実装するオブジェクト。
- IContributeEnvoySink インターフェイスによって、プロキシとクライアント パイプラインの間に挿入されたオブジェクト。
アプリケーションが、逆シリアル化レベルを Full にしないと利用できないリモート処理機能を必要とする場合は、リモート処理の高度な機能を使用することによって危険にさらされるリソースを保護するために、適切な認証の種類と暗号化のレベルを設定する必要があります。
逆シリアル化レベルは、プログラムによって設定することも、アプリケーションの構成ファイルで設定することもできます。
プログラムによる逆シリアル化レベルの設定
プログラムによって逆シリアル化レベルを設定するには、SoapServerFormatterSinkProvider オブジェクトまたは BinaryServerFormatterSinkProvider オブジェクトを作成するときに、次のプロパティを渡します。リモート処理システムは、フォーマッタがシンク チェインに挿入されるときに、フォーマッタに値を設定します。ホスト アプリケーション ドメインで逆シリアル化レベルを Full に設定する例を次に示します。
[C#]
// 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);
[Visual Basic]
' 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.
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.)
Dim chan As New TcpChannel(props, null, 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>
</configuration>
参照
構成 | RemotingConfiguration | BinaryServerFormatterSinkProvider.TypeFilterLevel | BinaryFormatter.FilterLevel