Javaシリアライズ・フィルタ

Javaシリアライズ・フィルタリング・メカニズムでは、セキュリティおよび堅牢性の向上に役立てるために、シリアライズ・オブジェクトの着信ストリームを検査します。フィルタは、デシリアライズされる前のクラスの着信インスタンスを検証できます。

JEP 290およびJEP 415で説明されているように、Javaシリアライズ・フィルタリング・メカニズムの目標は、次のとおりです:
  • デシリアライズできるクラスを適切なコンテキストの一連のクラスに絞り込む方法を提供します。

  • デシリアライズ中にグラフのサイズと複雑度のメトリックを提供して、フィルタ通常のグラフの動作を検証します。

  • RMIエクスポートされたオブジェクトで、呼出しで予期されるクラスを検証できるようにします。

フィルタには、次の2種類があります:

  • JVM全体のフィルタ: JVMのすべてのデシリアライズに適用されます。ただし、JVM全体のフィルタの、特定のデシリアライズにおけるクラスの検証の有無と方法は、他のフィルタとの組合せ方法によって異なります。
  • ストリーム固有のフィルタ: ある特定のObjectInputStreamからのクラスを検証します。

次の方法でシリアライズ・フィルタを実装できます:

  • jdk.serialFilterプロパティによるJVM全体のパターン・ベースのフィルタの指定: パターン・ベースのフィルタは、特定のクラス、パッケージまたはモジュールの名前を受け入れるか拒否できる一連のパターンで構成されます。配列サイズ、グラフ深度、合計参照およびストリーム・サイズに制限を設定できます。一般的なユースケースは、Javaランタイムを損なう可能性があるとして識別されたクラスを拒否リストに追加することです。jdk.serialFilterプロパティでパターン・ベースのフィルタを指定する場合、アプリケーションを変更する必要はありません。

  • ObjectInputFilter APIによるカスタムまたはパターン・ベースのストリーム固有のフィルタの実装: ObjectInputFilter APIを使用してフィルタを実装し、それをObjectInputStreamで設定できます。Config.createFilter(String)メソッドを呼び出すことで、ObjectInputFilter APIを使用してパターン・ベースのフィルタを作成できます。

ノート:

シリアライズ・フィルタは、デフォルトでは有効化も構成もされていません。システム・プロパティまたはセキュリティ・プロパティでフィルタを指定するか、ObjectInputFilterクラスで設定しないかぎり、シリアライズ・フィルタリングは行われません。

ストリーム内の新規オブジェクトごとに、フィルタ・メカニズムではフィルタが1つのみ適用されます。ただし、このフィルタはフィルタの組合せである可能性があります。

ほとんどの場合、特にフィルタ・ファクトリを指定していない場合は、ストリーム固有のフィルタはJVM全体のフィルタが設定されているかどうかを確認する必要があります。JVM全体のフィルタが存在する場合は、ストリーム固有のフィルタによってそれが起動され、ステータスがUNDECIDEDでないかぎり、JVM全体のフィルタの結果が使用されます。