Небезопасная десериализация - OWASP 10

27 апреля 2021

Сериализация и Десериализация.


Сериализация — это преобразование объекта в формат данных, который затем может быть возвращен в его первоначальную версию. Обратный процесс, в свою очередь, называют Десериализацией.

Данный процесс используют для сохранения объектов или его отправки другому пользователю. Наиболее популярными форматами для сериализацией являлись XML и затем JSON. Хотя нынче многие языки программирования позволяют с легкостью сериализовать и десериализовать объекты с помощью встроенных механизмов. Многие разработчиков пользуются этим благодаря простоте и скорости процесса.




Причины возникновения.

К сожалению, именно данный функционал также позволяет злоумышленникам использовать его для вызова вредоносного эффекта через не доверенные данные. Также эти механизмы притупляют и поощряют бдительность разработчиков, из-за чего они нередко совершают несколько ошибок в ходе написания кода, что затем приводит к серьёзным проблемам в безопасности приложения или сайта.

Также причиной для возникновения неуязвимости может являться использование десериализация пользовательского ввода данных. Дополнительные формы для проверки такой информации не настолько эффективны, как может показаться на первый взгляд. Во многом он неэффективен, так как практически невозможно каждую производную. К тому же эти методы сами по себе не идеальны, ибо проверяют объекты уже после десериализации и предотвратить атаку уже будет слишком поздно.




Насколько уязвимо мое приложение?

Уязвимость возникает в том случае, если приложение десериализует вредоносные и/или искаженные объекты, отправленные нарушителем.

Благодаря этому он получает возможность для совершения следующих видов атак:

  • Основанная на структуре объекта и данных, где злоумышленник редактирует логику приложения и/или же запускает выполнение кода удаленно, если имеющиеся классы доступны приложению и способны изменять его поведение в ходе или после десериализации.
  • Обычная подделка данных. Основанные на контроле доступа атак с использованием имеющихся структур данных и измененным содержимым.
  • Сериализацией могут воспользоваться для:

  • Дистанционной или мультипроцессорной связи (RPC/IPC).
  • Веб-сервисов и брокеров сообщений
  • Баз данных, файловых систем и серверов кэша.
  • HTTP cookie-файлов, параметров HTML-форм и маркеров аутентификации API.




  • Защита

    Единственной гарантией безопасности будет непринятие сериализованных объектов от небезопасных источников или использование лишь примитивных типов данных для сериализации. В противном случае стоит воспользоваться следующими вариантами:

  • Реализация проверок целостности (для цифровых подписей на каждых сериализованных объектах, например) для предотвращения возникновения вредоносных объектов или искажения имеющихся данных.
  • Применение строгих типовых ограничений для десериализации до создания объекта, ибо в основном код ожидает определяемый набор классов. Однако данную технику могут обойти, из-за чего надеяться лишь на неё не стоит
  • Изоляция и ввод кода, который запускает десериализацию в среде с низкой привилегией при возможности.
  • Регистрация ошибок и возражений десериализации. В качестве примера можно выделить случаи когда входящий тип не ожидается или десериализация порождает возражения.
  • Ограничение или мониторинг входящих/исходящих сетевых подключений от контейнеров или серверов, совершающих десериализацию.
  • Мониторинг процесса десериализации для нахождения пользователя, которых запускает его беспрерывно.




  • Итоги

    Сами по себе, процессы сериализации и десериализации представляют собой отличным способом для работы с данными и их отправки по сети. Однако, подобно видео игре, использовать десериализацию не так уж и сложно, но вот делать это правильно уже совсем другая истории.

    Именно неопытность разработчиков открывает пути для злоумышленников, которыми они могут злоупотребить. Важно научится совершать сериализацию и десериализацию должным образом, а так попросту не забывать о безопасности вашего сервиса.