Maison >développement back-end >C++ >L'utilisation de `TynEnameHandling.all` dans Newtonsoft.json est-elle sûre pour désérialiser les données non fiables?

L'utilisation de `TynEnameHandling.all` dans Newtonsoft.json est-elle sûre pour désérialiser les données non fiables?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-31 16:26:09433parcourir

newtonsoft.json's TypeNameHandling.All: risques de sécurité lors de la désérialisation des données non fiables

La propriété TypeNameHandling dans newtonsoft.json dicte comment les objets polymorphes sont désérialisés. Le définir sur TypeNameHandling.All permet à newtonsoft.json d'instancier des types en fonction de la propriété $type dans le nouveau JSON. Cependant, cela présente des vulnérabilités de sécurité importantes lors de la gestion des données non fiables.

Is Using `TypeNameHandling.All` in Newtonsoft.Json Safe for Deserializing Untrusted Data?

Implications de sécurité

Les acteurs malveillants peuvent exploiter TypeNameHandling.All en injectant une propriété $type spécifiant un type nocif dans le JSON. Cela leur permet d'exécuter du code arbitraire ou d'effectuer des actions indésirables sur le système cible.

Considérons une classe apparemment inoffensive:

<code class="language-csharp">public class Vehicle
{
    public string Make { get; set; }
    public string Model { get; set; }
}</code>

Une charge utile JSON malveillante pourrait ressembler à ceci:

<code class="language-json">{
  "$type": "System.Diagnostics.Process",
  "Make": "Attack",
  "Model": "DeleteC:\ImportantFiles"
}</code>

Bien que les propriétés Make et Model soient bénignes, la propriété $type force la création d'un objet System.Diagnostics.Process, initiant potentiellement des processus nocifs sur le système. Cela contourne la vérification normale de type et ouvre la porte à diverses attaques.

atténuer le risque

pour empêcher de telles attaques, évitez d'utiliser TypeNameHandling.All lorsque la désérialisation de JSON à des sources externes et non fiables. Au lieu de cela, utilisez TypeNameHandling.None pour désactiver la manipulation du nom de type. Alternativement, implémentez une coutume SerializationBinder pour contrôler méticuleusement quels types sont autorisés pendant la désérialisation, des types de sécurité en plaques blanches. Cela fournit une approche plus granulaire et sécurisée pour manipuler la désérialisation polymorphe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn