Получить доступ

Почему встроенную Java-сериализацию считают небезопасной и устаревшей?

MiddleСериализация
Ещё спрашивают так:
  • Почему встроенную Java-сериализацию считают опасной и что используют вместо неё?
Коротко

Безопасность: десериализация сама создаёт объекты классов из потока и вызывает их методы восстановления до любой проверки — из классов в classpath собирают гаджет-цепочку и получают выполнение кода. Плюс обход конструктора (инварианты не проверяются) и форма, намертво привязанная к структуре класса. Вместо — JSON, Protobuf, Avro.

  • Правило: не десериализовать недоверенные данные
  • Защита: фильтры десериализации (ObjectInputFilter, Java 9)
  • Сериализованная форма — часть публичного контракта класса

А ещё Громкие уязвимости: Apache Commons Collections, WebLogic, Jenkins

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Главная претензия — безопасность: механизм по построению создаёт произвольные объекты из потока байтов, и в classpath почти всегда находится цепочка классов, которую можно сложить в исполнение команды. Именно поэтому правило звучит категорично: не десериализуйте недоверенные данные. Вторая проблема архитектурная — объект собирается в обход конструктора, значит проверки инвариантов не выполняются, и класс может оказаться в невозможном состоянии. Третья — сериализованная форма становится частью публичного API: переименовали поле и сломали совместимость, что и пытается сгладить serialVersionUID. Рекомендация Блоха однозначна: использовать текстовые или схемные форматы вроде JSON, Protobuf и Avro.

Что хотят услышать

  • Механизм уязвимости.
  • Обход конструктора и жёсткий формат.
  • Альтернативы.

Частые ошибки

  • Считать проблему исключительно теоретической.
  • Полагать, что фиксация serialVersionUID решает вопрос безопасности.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Десериализация недоверенных данных позволяет исполнить код через цепочки гаджетов в classpath
  • ✓Десериализация создаёт объект в обход конструктора, поэтому инварианты не проверяются
  • ✓Сериализованная форма становится частью публичного контракта класса и сковывает рефакторинг
  • ✗Формат несовместим между разными версиями JVM одного производителя

Что спросят дальше

  • Что такое цепочка гаджетов при десериализации?
  • Как фильтрация десериализации помогает снизить риск?
  • Что произойдёт, если не объявить serialVersionUID явно?
  • Чем Externalizable отличается от Serializable и решает ли он проблему?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем