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