Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования