Десеріалізація — перетворення збережених чи переданих даних назад на програмні об’єкти; якщо її застосовують до неперевірених даних, зловмисник може домогтися виконання коду.
Як працюють атаки на десеріалізацію
Застосунки серіалізують об’єкти — перетворюють їх на байти, JSON чи XML, — щоб зберегти чи передати мережею, а на іншому боці десеріалізують. Формати на кшталт Java-серіалізації, .NET BinaryFormatter, функції unserialize() у PHP чи модуля pickle у Python уміють відтворювати об’єкти довільних типів і автоматично викликати їхні методи. Зловмисник, що керує серіалізованими даними, будує з класів у бібліотеках застосунку «ланцюжки гаджетів» (gadget chains), і під час відтворення об’єктів виконуються команди. Інструменти на кшталт ysoserial генерують такі навантаження автоматично.
Слабкість описано як CWE-502. Дослідження 2015 року про ланцюжки гаджетів у бібліотеці Apache Commons Collections показало, що так можна атакувати безліч Java-застосунків, зокрема Jenkins та Oracle WebLogic.
Чому це важливо
Небезпечна десеріалізація зазвичай веде до віддаленого виконання коду, часто без автентифікації, тому такі вразливості отримують найвищі оцінки небезпеки. Корпоративне проміжне ПЗ, VPN-шлюзи й системи передавання файлів не раз зламували через помилки десеріалізації, а публічні експлойти з’являються швидко. Це близький родич впровадження коду, що входить до категорії OWASP Top 10 «Порушення цілісності ПЗ і даних».
Як запобігти
- Не десеріалізувати дані з неперевірених джерел за допомогою нативних форматів об’єктів; використовувати прості формати на кшталт JSON зі суворою схемою.
- Якщо без нативної десеріалізації не обійтися — застосовувати білі списки дозволених класів і перевірку цілісності (підписи).
- Видаляти невикористовувані бібліотеки, що дають ланцюжки гаджетів, і оновлювати фреймворки.
- Відстежувати винятки десеріалізації та незвичні дочірні процеси.