Typenamehandling внимание в Newtonsoft Json

On этой ссылка, в разделе замечаний упоминается, что"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 ? Был бы признателен за рабочий пример.

2 ответов


при десериализации с TypeNameHandling.All и без проверок SerializationBinder json.net попытается создать instace типа, который поставляется в качестве метаданных в 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 - сериализуемый класс, целью которого является ведение списка временных файлов, полученных в результате процесса компиляции, и удаление их, когда они отсутствуют нужно больше времени. Для обеспечения удаления файлов класс реализует финализатор, который будет вызываться при очистке объекта сборщиком мусора. Злоумышленник мог бы создать сериализованную версию этого класса, которая указывала бы его внутреннюю коллекцию файлов на любой файл в системе жертв. Это будет удалено в какой-то момент после десериализации без какого-либо взаимодействия с приложением десериализации.

    [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

некоторые дополнительные гаджеты атаки были идентифицированы в BlackHat Альваро Муньоса и Александра Мироша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 - вектор атаки: выполнение статического метода во время синтаксического анализа полезной нагрузки Xaml.

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

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

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

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

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