Insecure Deserialization — небезопасная десериализация

Я разбираю реальные веб‑уязвимости и показываю, как их искать, эксплуатировать в безопасной среде и закрывать в проде. Без воды: чек‑листы атак, редкие кейсы, ошибки разработчиков и практики защиты от CSRF, XXE, Prototype Pollution, десериализации, race conditions, XSS и не только. Если вы пишете веб или проверяете его на прочность — вам сюда.

десериализацияinsecure deserializationrce

🔖 Немного базы

Сериализация - это преобразование объекта (со свойствами, полями, состоянием) в строку или байтовый поток, чтобы его можно было хранить (файл, кеш, БД) или передавать по сети.

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

▶️ Insecure Deserialization - это уязвимость, при которой приложение десериализует данные из недоверенного источника и тем самым дает атакующему возможность изменить ход выполнения программы или внедрить произвольные объекты.

🔵 Тип:
Web, Server-Side

⁉️ В чем суть:

  • Приложение принимает сериализованный объект (может прилетать из cookie, параметра, заголовка и пр.)
  • Доверяет его структуре и содержимому
  • Десериализует без доп. проверок
  • В процессе десериализации могут вызываться методы, хуки, "магические" функции, гаджеты из сторонних библиотек

Главная опасность заключается в том, что экплоит может отработать даже не достигнув логики или не пройдя дальнейшие проверки приложения - урон наносится сразу при десериализации объекта

📍 Пример уязвимого кода

unserialize(_COOKIE['session'])

🔵Разновидности:

  • По формату сериализованных данных: строковые (PHP, JSON, YAML), бинарные (Java, Python, Ruby)
  • По характеру эксплуатации: изменение свойств объекта, внедрение произвольного объекта (часто цепочки гаджетов - своеобразный ROP-chain мира веба), иногда хорошо совмещается с низлежащими уязвимостями (напр. Type Juggling)

🔵 Влияние:

  • Обход авторизации и эскалация привилегий (подмена роли/ID в объекте)
  • Чтение / изменение чувствительных данных
  • Удалённое выполнение кода (RCE) через цепочку гаджетов
  • Отказ в обслуживании (краш приложения при десериализации)

💬 Как защититься?

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

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

📘 Из личного опыта

Уязвимость которая актуальна сколько я занимаюсь инфобезом на примерно одном и том же уровне. Она часто незаметна + не все приложения пользуются сериализацией в целом, но в стабильные промежутки времени я вижу новые CVE с десериализацией. "Универсальных" цепочек гаджетов при этом стало как будто меньше, но в большинстве случаев либо подойдет уже известный, либо все равно придется строить самому, исходя из исходного кода. Ну и в CTF она тоже часто заглядывает

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

В общем, уязвимость крутая, но требует некоторой усидчивости и насмотренности для эффективного использования в бою

P.S. Там вроде новый закон есть/будет, поэтому на всякий случай - картинку нейронка нарисовала. Какая именно - без понятия, у меня там целый котел из LLM и конкретная модель на эвристиках выбирается

#edu #vuln #web #deser #insecure_deserialization
☠️ Hunt Or Be Hunted

Изображение: разбитый куб и поток бинарных данных с надписью "unserialize()" на фоне, символизирующее уязвимость insecure deserialization в веб‑безопасности.
Иллюстрация insecure deserialization: поток данных с надписью "unserialize()" и символ черепа.

Дискуссия

Daniil Filippov
Ждём ещё больше фото от нейронок 😎
Присоединиться к обсуждению →

Читайте так же