Фильтры десериализации
Ограничение допустимых для десериализации классов в целях предотвращения атак.
Сравнение кода
✕ 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)
Как это работает
ObjectInputFilter позволяет вести списки разрешённых и запрещённых классов, а также ограничивать глубину графа объектов, размеры массивов и счётчики ссылок. Это защищает от уязвимостей десериализации без внешних библиотек.
Связанная документация
Доказательство