flawopen.com/Десериализация Java/Безопасность ObjectInputStream
Безопасен ли ObjectInputStream для недоверенных данных?
Обычно нет: 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 удалённо доступным.
Если нативную сериализацию нельзя убрать
- ✓Предпочитайте JSON или Protocol Buffers с явной схемой; преобразуйте в фиксированный DTO, проверяйте поля и права.
- ✓Если необходимо, задайте контекстный
ObjectInputFilterпередreadObject(); разрешайте только точные нужные классы. - ✓Ограничьте глубину, ссылки, массивы и размер потока по корректным измеренным данным. Один allowlist не предотвращает исчерпание ресурсов.
- ✓Не включайте широкую полиморфную типизацию для недоверенного JSON: произвольные метаданные подтипов снова создают объекты.
- ✓Обновляйте Java и зависимости, удаляйте лишние библиотеки и обрабатывайте старые потоки с минимальными правами и ресурсными лимитами.
Частый вопрос
Он снижает риск при узком allowlist и лимитах до чтения, но не является универсальным санитайзером. Важны разрешённые классы, их поведение и реальная активация фильтра; проверки и авторизация приложения также необходимы. Избегайте нативной сериализации пользовательских данных.
Первичные источники
- Рекомендации Oracle по безопасному кодированию Java — сериализация
- Фильтры сериализации Oracle Java (JDK 25)
- Предупреждение Oracle — CVE-2015-4852
- Памятка OWASP по десериализации
- Jackson Databind — полиморфная десериализация