Десериализация — это процесс преобразования данных из «плоского» представления (строки, байтового потока или файла) обратно в объект в памяти программы. На этапе сериализации объект раскладывают на данные, которые удобно хранить или передавать по сети, например в JSON, XML или бинарном формате. Десериализация делает обратное: читает эти данные и воссоздаёт исходную структуру — со значениями полей, вложенными объектами и иногда даже с поведением, которое зависит от класса.
В повседневной разработке десериализация используется повсюду: когда бэкенд принимает JSON из браузера, клиентское приложение читает кэш, сервисы обмениваются сообщениями через очереди, а мобильное приложение поднимает состояние из локального файла. Это экономит время и избавляет от ручного парсинга: разработчик описывает модель, а библиотека сама наполняет её данными.
Проблемы начинаются, когда приложение десериализует непроверенные данные. Если библиотека при воссоздании объекта может автоматически вызывать «опасные» методы или загружать произвольные классы, злоумышленник подсовывает специально сформированный поток байтов или JSON и добивается выполнения кода, утечки данных или отказа в обслуживании. Так появились «уязвимости десериализации»: они не про сам формат, а про то, что программа слишком доверяет входу и даёт ему влиять на то, какие объекты создаются и что они делают.
Безопасная практика — жёстко контролировать, какие типы можно воссоздавать, и не использовать автоматическую десериализацию для данных от пользователя без проверки схемы. Полезны «белые списки» классов, строгие схемы (JSON Schema, Protobuf), явное сопоставление полей вместо «магии», а также изоляция и ограничение прав кода, который обрабатывает вход. Дополнительно помогают версионирование форматов, лимиты на размер и глубину структур и простое правило: всё, что приходит извне, сначала валидируется, и только потом превращается в объекты.