Во-первых, вам нужно понять свой контекст, чтобы определить угрозы безопасности. (Когда я говорю о «доверии», я немного сокращаюсь. Я говорю намеренно злонамеренно.)
Если последовательные данные были созданы, сохранены и прочитаны с одинаковым доверием, то их нет реальная проблема (кроме стандартных ошибок). Обратите внимание, что если вы пишете какую-либо конфиденциальную информацию, тогда сериализованные данные также чувствительны (это кажется очевидным, но там существует достаточная степень косвенности).
Если по какой-либо причине сериализованные данные недоверены, то есть еще немного, чтобы рассмотреть. Внутренняя структура воссозданных объектов может быть «необычной». Данные могут быть несовместимыми. У вас могут быть общие изменчивые объекты, которые должны быть отдельными. Дезериализация может вызвать бесконечный цикл или бесконечный цикл, который просто не может быть завершен до жары смерти Вселенной. И, конечно, данные могут быть ложью.
Если вы пишете код библиотеки, который используется менее доверенным кодом, то все становится более интересным:
В случае «календаря ошибка» (и подобные), то есть о deserialising произвольный поток с вредоносными данных и вредоносного кода. В Руководстве по безопасному кодированию Java предлагается выполнить проверки безопасности (используя «Модель безопасности Java2») в пользовательских методах readObject
, что подразумевает, что вы не должны вызывать десериализацию с большим доверием, чем код и данные.
Со стороны десериализуемых объектов вещи сложнее. Объекты, предоставленные ObjectInputStream
по readObject
, readUnshared
, defaultReadObject
, readFields
или просто десериализация по умолчанию может иметь ссылки, захваченные вредоносным кодом, или для не-конечных классов подклассифицироваться злонамеренно. Объект может также использоваться во время десериализации, когда он частично инициализируется. Deserialisation не вызывает «реального» конструктора десериализованного класса (readObject
/readObjectNoData
- это своего рода псевэ-конструктор, который не может установить final
). Это всего лишь кошмар, поэтому вы, вероятно, не хотите, чтобы ваши чувствительные классы были сериализованы.
В реализации сериализации и десериализации имеется ряд уязвимостей. Вам не нужно беспокоиться об этом, если вы не реализуете его самостоятельно.
+1 полностью тщательный ответ –