I/O 上級

デシリアライゼーションフィルター

攻撃を防ぐためにデシリアライズ可能なクラスを制限する。

✕ 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 9(2017年9月)以降、広く利用可能

ObjectInputFilterによりクラスの許可リスト・拒否リスト、オブジェクトグラフの深さ、配列サイズ、参照数の制限ができます。外部ライブラリなしにデシリアライゼーションの脆弱性を防御できます。

共有 𝕏 🦋 in