🔖 Немного базы
Сериализация - это преобразование объекта (со свойствами, полями, состоянием) в строку или байтовый поток, чтобы его можно было хранить (файл, кеш, БД) или передавать по сети.
Десериализация - обратный процесс: из строки/байтов снова собирается объект нужного типа и попадает в код, где с ним продолжает работать приложение. В вебе так часто гоняют сессии, токены, кэшированные данные и объекты для 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




Дискуссия