Почему встроенную Java-сериализацию считают небезопасной и устаревшей?
- Почему встроенную 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 и решает ли он проблему?
Разбор темы
- Сериализация и форматы данных
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.