ТипNameHandling предостережение в Newtonsoft Json

По этой ссылке в разделе примечаний упоминается, что « TypeNameHandling should be used with caution when your application deserializes JSON from an external source. Incoming types should be validated with a custom SerializationBinder when deserializing with a value other than TypeNameHandling.None. ». В каких случаях JSON из внешнего источника будет вредным, если сериализован / десериализован с помощью TypeNameHandling.All ? Будет оценен рабочий пример.

При десериализации с помощью TypeNameHandling.All и без проверки SerializationBinder json.net попытается создать экземпляр типа, который входит в метаданные в JSON.

 public class Car { public string Maker { get; set; } public string Model { get; set; } } { "$type": "Car", "Maker": "Ford", "Model": "Explorer" } //create a Car and set property values 

Но злоумышленник может отправить вам опасные типы, существующие в вашем коде или в рамках.

т.е. здесь System.CodeDom.Compiler.TempFileCollection является сериализуемым classом, целью которого является сохранение списка временных файлов, возникших в результате процесса компиляции, и удаление их, когда они больше не нужны. Чтобы убедиться, что файлы удалены, class реализует финализатор, который будет вызываться, когда объект очищается сборщиком мусора. Злоумышленник сможет построить сериализованную версию этого classа, указав свою внутреннюю коллекцию файлов на любой файл в системе жертв. Это будет удалено в некоторый момент после десериализации без какого-либо взаимодействия с десериализирующим приложением.

  [Serializable] public class TempFileCollection { private Hashtable files; // Other stuff... ~TempFileCollection() { if (KeepFiles) {return} foreach (string file in files.Keys) { File.Delete(file); } } } { "$type": "System.CodeDom.Compiler.TempFileCollection", "BasePath": "%SYSTEMDRIVE", "KeepFiles": "False", "TempDir": "%SYSTEMROOT%" } // or something like this, I just guessing but you got the idea 

Некоторые дополнительные гаджеты нападений были идентифицированы в черновике Альваро Муньоса и черновике Олексана Мироша https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp .pdf . Эти:

  • System.Configuration.Install.AssemblyInstaller – Вектор атаки: выполнить полезную нагрузку при загрузке сборки.

  • System.Activities.Presentation.WorkflowDesigner – Вектор атаки: выполнить статический метод во время parsingа полезной нагрузки Xaml.

  • System.Windows.ResourceDictionary – вектор атаки: злоумышленник отправляет полезную нагрузку с URL-адресом контролируемому серверу, этот сервер отвечает полезной нагрузкой Xaml и ContentType ContentType = application/xaml+xml а целевой сервер будет выполнять требуемый статический метод во время parsingа полезной нагрузки Xaml.

  • System.Windows.Data.ObjectDataProvider – вектор атаки: 1) вызывает любой метод немаршалированного объекта; 2) Мы можем вызвать параметризованный конструктор желаемого типа с контролируемыми параметрами; 3) вызвать любой общеansible метод, включая статические с контролируемыми параметрами.

  • System.Windows.Forms.BindingSource – вектор атаки: произвольный геттер-вызов.

  • Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider – Attack vector: позволяет переходить от сеттеров к вложенной десериализации BinaryFormatter.

Однако обратите внимание, что тип гаджета атаки должен быть совместим с (присваиваемым) ожидаемому типу, который десериализуется для успешной атаки. Это всегда верно, когда ожидаемый тип является object или dynamic и может быть правдой в других ситуациях. См. External json уязвим из-за Json.Net TypeNameHandling auto? для деталей.

  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Deserialize JSON в динамический объект C #?
  • Как реализовать TypeAdapterFactory в Gson?
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Django rest framework, используйте разные сериализаторы в том же ModelViewSet
  • Сохранение / загрузка данных в Unity
  • Как настроить сериализацию списка объектов JAXB для JSON?
  • Специальная сериализация Jackson JSON для определенных полей
  • Серийный цикл ActiveRecord с использованием JSON вместо YAML
  • Как получить json.net для сериализации членов classа, полученных из List ?
  • Давайте будем гением компьютера.