FlawOpen

flawopen.com/Десериализация Java/Безопасность ObjectInputStream

Безопасен ли ObjectInputStream для недоверенных данных?

Справочник по безопасности Java
Простыми словами

Обычно нет: readObject() восстанавливает Java-объекты и может вызывать методы десериализации классов. Это похоже на форму, чьи вложения выполняют собственные инструкции. Вредоносный поток может задействовать классы, уже доступные приложению. Результат зависит от классов, библиотек, достижимых путей и границы ввода; каждый вызов не означает исполнение кода.

РИСКОВАННО: нативная десериализация
// Не передавайте сюда байты под контролем атакующего.
try (var in = new ObjectInputStream(untrustedStream)) {
    Object value = in.readObject();
    handle(value);
}
БЕЗОПАСНЕЕ: разбор фиксированного типа
// Отключите широкую полиморфную типизацию для недоверенного ввода.
ObjectMapper mapper = new ObjectMapper();
OrderRequest value = mapper.readValue(
    untrustedBytes, OrderRequest.class
);
validate(value);

Как ошибка становится достижимой

API, очередь, кеш или импорт принимает байты под контролем пользователя. Дойдя до ObjectInputStream.readObject(), они заставляют JVM восстанавливать объекты доступных сериализуемых классов. Gadget-цепочка — возможный путь через поведение таких классов, а не payload каждого потока. Oracle описывает CVE-2015-4852 как отдельный случай: атаки без аутентификации через WebLogic T3 на указанные версии. Это не делает любое использование ObjectInputStream удалённо доступным.

Если нативную сериализацию нельзя убрать

Частый вопрос

Делает ли ObjectInputFilter readObject() безопасным?

Он снижает риск при узком allowlist и лимитах до чтения, но не является универсальным санитайзером. Важны разрешённые классы, их поведение и реальная активация фильтра; проверки и авторизация приложения также необходимы. Избегайте нативной сериализации пользовательских данных.

Первичные источники

См. также Небезопасная десериализация: риски и защита | flawopen.com Newtonsoft.Json TypeNameHandling: безопасная настройка? PHP unserialize() и недоверенные данные Python pickle.load(): риск недоверенных данных Безопасен ли Ruby YAML.load? Версии Psych и safe_load .NET BinaryFormatter: риски и переход