Небезопасная десериализация
Что такое Небезопасная десериализация?
Небезопасная десериализацияУязвимость, при которой приложение десериализует недоверенные данные, позволяя атакующему создавать произвольные объекты и часто получать удалённое выполнение кода.
Когда приложение преобразует сериализованные данные (бинарные форматы Java/PHP/Python/.NET, YAML или JSON с метаданными типов) обратно в объекты, десериализатор может вызывать конструкторы, магические методы или цепочки гаджетов (gadget chains) — последовательности уже загруженных методов, которые, будучи связанными вместе, достигают опасного стока, такого как Runtime.exec. Получая недоверенный ввод, атакующий формирует payload, который во время десериализации запускает это поведение, что приводит к удалённому выполнению кода (RCE), обходу аутентификации, записи файлов или отказу в обслуживании.
Классический пример — CVE-2015-4852: Oracle WebLogic небезопасно десериализовал неаутентифицированные Java-объекты, отправленные по протоколу T3 на TCP 7001, и при наличии Apache Commons Collections в classpath инструмент ysoserial создавал рабочий RCE-гаджет. Первый патч Oracle использовал хрупкий чёрный список (deny-list) классов вместо того, чтобы полностью запретить десериализацию недоверенных данных. Похожие изъяны затронули Apache Struts (CVE-2017-9805, через XStream) и бесчисленные PHP-баги внедрения объектов через unserialize(). В списке OWASP категория переместилась из A8:2017 в более широкую A08:2021 — Software and Data Integrity Failures.
flowchart LR A[Атакующий] -->|сформированный сериализованный блоб<br/>cookie / T3 / тело API| APP[Приложение] APP -->|десериализует недоверенные байты| DZ[Десериализатор] DZ -->|создаёт объекты<br/>вызывает магические методы| GC[Цепочка гаджетов<br/>в classpath] GC -->|достигает опасного стока| RCE[Runtime.exec / запись файла] APP -. защита .-> SIG[Подписанный payload +<br/>allow-list типов] SIG -.->|отклонить неизвестные типы| DROP[Отбросить]
Меры защиты: никогда не десериализуйте недоверенные данные; предпочитайте форматы, привязанные к схеме (обычный JSON, Protobuf), без восстановления типов; подписывайте или защищайте HMAC сериализованные payload'ы; применяйте строгий allow-list десериализуемых типов; и своевременно обновляйте рантаймы — в современном .NET BinaryFormatter объявлен устаревшим и удалён.
● Примеры
- 01
Java-приложение десериализует сессионную cookie с Commons Collections в classpath — RCE.
- 02
Python-сервис выполняет pickle.loads на байтах, контролируемых пользователем.
● Частые вопросы
Что такое Небезопасная десериализация?
Уязвимость, при которой приложение десериализует недоверенные данные, позволяя атакующему создавать произвольные объекты и часто получать удалённое выполнение кода. Относится к категории Уязвимости в кибербезопасности.
Что означает Небезопасная десериализация?
Уязвимость, при которой приложение десериализует недоверенные данные, позволяя атакующему создавать произвольные объекты и часто получать удалённое выполнение кода.
Как защититься от Небезопасная десериализация?
Защита от Небезопасная десериализация обычно сочетает технические меры и операционные практики, как описано в определении выше.
Какие есть другие названия Небезопасная десериализация?
Распространённые альтернативные названия: Небезопасная сериализация, Уязвимость десериализации объектов.