… И Newtonsoft.Json, одной из наиболее распространенных библиотек, используемых разработчиками C #.

Сериализация и десериализация - обычные операции во многих приложениях, в основном в веб-приложениях, которые получают данные из мира и должны понимать запросы пользователей.

Сериализация - это процесс преобразования структур данных или состояния объекта в формат, который может быть сохранен.

or

Сериализация - это процесс сохранения состояния объекта в виде последовательности байтов.

Насколько мне известно, сложно исследовать эксплойт сериализации и контролировать систему. В противном случае исследование уязвимостей десериализации может оказаться легким делом, если вы используете неправильные конфигурации и инструменты.

Десериализация - это процесс восстановления сериализованных данных.

Уязвимость Newtonsoft.Json

Newtonsoft.Json использует отражение для создания объектов и десериализации документа JSON в объект памяти. Процессы отражения могут исследовать, анализировать и изменять свою собственную структуру во время выполнения. Newtonsoft.Json использует конструктор без параметров по умолчанию для создания нового объекта и заполнения полей и свойств.

Как вы знаете, разработчики обычно избегают повторяющегося кода. Вместо этого мы следуем шаблонам и соглашениям и пытаемся создать помощников для использования в кросс-приложениях, как вы можете видеть ниже.

На самом деле вроде все в порядке, да?…

No! 😕

Итак, в чем проблема ??? Проблема в конфигурации TypeNameHandling.All. Он десериализует объекты, в которых атрибут $type исходного документа JSON будет указывать тип данных. Как вы думаете, что произойдет, когда вы десериализуете System.Diagnostics.Process? 🤓

Конечно, это особая ситуация, но поверьте мне, можно украсть важную информацию с небольшой проблемой безопасности. И ты это знаешь 😉.

Как решить проблему

ПРАВИЛО: всегда нужно использовать определенные типы! Не используйте универсальные типы, такие как object или dynamic. НИКОГДА !!

Кроме того, измените конфигурацию TypeNameHandling на TypeNameHandling.None. Следовательно, Newtonsoft.Json не будет использовать исходный документ JSON для указания типа объекта. Вместо этого он будет использовать тип, полученный из метода DeserializeObject (DeserializeObject<T>).

Таким образом, объект System.Diagnostics.Process нельзя привести к общему типу T, например UserModel, SubmitResponse, ContactModel и так далее, и так далее ...

❗ ВАЖНО: иногда десериализацию документа JSON невозможно без TypeNameHandling.Allconfiguration. Как это решить? → Добавляйте настраиваемые проверки к своим объектам, значениям, свойствам и их типам. Только так можно доверять внешним данным.

Вывод

Никогда не доверяйте внешним данным!

Для вашей безопасности всегда проверяйте все входные данные и обращайте внимание на типы динамики. Доверяйте своей работе, но будьте осторожны, потому что всегда есть что-то, что может пройти мимо вас. Советую всегда читать стороннюю документацию, которой вы регулярно пользуетесь и которой доверяете; большинство из них предупредит вас об известных уязвимостях. И, если возможно, используйте дополнительное программное обеспечение для аудита вашего исходного кода, вишенка на вершине пирога!

использованная литература