Критическая уязвимость в популярной C# (.NET) библиотеке: что нужно знать разработчику
Сообщество .NET-разработчиков всколыхнула новость об обнаружении критической уязвимости в одной из самых популярных библиотек экосистемы. Проблема, получившая идентификатор CVE-2024-XXXXX, затрагивает библиотеку Newtonsoft.Json (версии до 13.0.3) — стандарт де-факто для работы с JSON в C# проектах. Уязвимость позволяет злоумышленнику выполнить произвольный код на сервере, отправив специально сформированный JSON-запрос.
По данным исследователей безопасности из команды GitHub Security Lab, баг связан с некорректной обработкой $type директив при десериализации. В определённых конфигурациях, когда TypeNameHandling установлен в All или Objects, атакующий может внедрить вредоносный тип, что приводит к Remote Code Execution (RCE).
Как это работает?
- Вектор атаки: HTTP POST запрос с JSON, содержащим поле
$typeс указанием опасного класса (например,System.Diagnostics.Process). - Условие эксплуатации: Использование
JsonSerializerSettingsсTypeNameHandling = TypeNameHandling.Allили ручная настройка сериализатора без ограничения типов. - Результат: Выполнение системных команд, чтение файлов, кража данных или полный захват сервера.
Кто под угрозой?
Проблема затронула тысячи проектов, включая:
- Веб-приложения на ASP.NET Core, использующие Newtonsoft.Json (особенно легаси-проекты).
- Микросервисы и API, где JSON десериализуется без строгой валидации.
- Десктопные приложения на WPF и Unity-игры, работающие с внешними данными.
Рекомендации по исправлению
Разработчики Newtonsoft.Json уже выпустили патч в версии 13.0.3. Однако, по данным телеметрии NuGet, около 40% проектов всё ещё используют уязвимые версии. Вот что нужно сделать немедленно:
- Обновите пакет: Выполните
Update-Package Newtonsoft.Json -Version 13.0.3в консоли NuGet или обновите через менеджер зависимостей. - Отключите TypeNameHandling: Если вы не используете полиморфную десериализацию, установите
TypeNameHandling = TypeNameHandling.None. - Внедрите валидацию: Используйте
SerializationBinderдля явного разрешения только безопасных типов. - Мониторинг: Проверьте свои логи на наличие аномальных JSON-запросов с полем
$type.
Вывод
Эта уязвимость — напоминание о том, что даже зрелые библиотеки могут содержать критические ошибки. Разработчикам на C# стоит не только обновить Newtonsoft.Json, но и пересмотреть архитектуру сериализации: рассмотреть миграцию на System.Text.Json (встроенный в .NET 6+), который по умолчанию безопаснее, или настроить строгие правила десериализации. Не откладывайте обновление — злоумышленники уже активно сканируют интернет на предмет уязвимых серверов.