デシリアライゼーションフィルター
攻撃を防ぐためにデシリアライズ可能なクラスを制限する。
コード比較
✕ Java 8
// Dangerous: accepts any class
ObjectInputStream ois =
new ObjectInputStream(input);
Object obj = ois.readObject();
// deserialization attacks possible!
✓ Java 9+
ObjectInputFilter filter =
ObjectInputFilter.Config
.createFilter(
"com.myapp.*;!*"
);
ois.setObjectInputFilter(filter);
Object obj = ois.readObject();
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
セキュリティ
予期しない・悪意あるクラスのデシリアライゼーションを防止します。
細かい制御
深さ、配列サイズ、参照数、クラスパターンを制御できます。
JVM全体に適用
JVM内のすべてのデシリアライゼーションにグローバルフィルターを設定できます。
旧来のアプローチ
すべてを受け入れる
モダンなアプローチ
ObjectInputFilter
JDKバージョン
9
難易度
上級
JDKサポート
デシリアライゼーションフィルター
利用可能
JDK 9(2017年9月)以降、広く利用可能
仕組み
ObjectInputFilterによりクラスの許可リスト・拒否リスト、オブジェクトグラフの深さ、配列サイズ、参照数の制限ができます。外部ライブラリなしにデシリアライゼーションの脆弱性を防御できます。
関連ドキュメント