… И 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.All
configuration. Как это решить? → Добавляйте настраиваемые проверки к своим объектам, значениям, свойствам и их типам. Только так можно доверять внешним данным.
Вывод
Никогда не доверяйте внешним данным!
Для вашей безопасности всегда проверяйте все входные данные и обращайте внимание на типы динамики. Доверяйте своей работе, но будьте осторожны, потому что всегда есть что-то, что может пройти мимо вас. Советую всегда читать стороннюю документацию, которой вы регулярно пользуетесь и которой доверяете; большинство из них предупредит вас об известных уязвимостях. И, если возможно, используйте дополнительное программное обеспечение для аудита вашего исходного кода, вишенка на вершине пирога!