Maison >développement back-end >C++ >La désérialisation JSON automatique avec « TypeNameHandling.Auto » de Json.Net est-elle sécurisée, même en limitant la désérialisation à un type spécifique ?

La désérialisation JSON automatique avec « TypeNameHandling.Auto » de Json.Net est-elle sécurisée, même en limitant la désérialisation à un type spécifique ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-07 14:16:41985parcourir

Is Automatic JSON Deserialization with Json.Net's `TypeNameHandling.Auto` Secure, Even When Limiting Deserialization to a Specific Type?

Le JSON externe peut-il être vulnérable en raison de la gestion automatique du nom de type Json.Net ?

Problème :

Dans les applications de sites Web où les utilisateurs téléchargent des objets JSON personnalisés, il est impératif d'être conscient des menaces potentielles découlant du type JSON automatisé. désérialisation. La question est de savoir si la désérialisation automatique de type est sensible aux vulnérabilités si le seul type désérialisé est un type spécifique (par exemple, MyObject) et qu'aucun des membres de MyObject n'a le type System.Object ou dynamique.

Réponse :

Bien que le respect de ces conditions réduit considérablement le risque, il ne garantit pas une protection complète. Le paramètre TypeNameHandling de Json.Net, lorsqu'il est défini sur Auto, peut potentiellement créer des objets basés sur les informations « $type » même lorsqu'aucun champ correspondant n'existe dans MyObject.

Explication détaillée :

Les attaques ciblant Json.Net exploitent le paramètre TypeNameHandling pour construire des « gadgets d'attaque » – des objets conçus pour compromettre le système récepteur. Les mécanismes de protection de Json.Net incluent l'ignorance des propriétés inconnues et la vérification de la compatibilité des types. Cependant, il existe des scénarios dans lesquels un gadget d'attaque peut être construit même sans aucun membre non typé évident :

  • Désérialisation de collections non typées (par exemple, ArrayList, List)
  • Désérialisation de collections semi-typées (par exemple, CollectionBase)
  • Désérialisation des types qui implémentent ISerializing (par exemple, Exception)
  • Désérialisation des types avec sérialisation conditionnelle des membres (par exemple, objet public tempData; public bool ShouldSerializeTempData() { return false; })
  • Recommandations :

    • Faites preuve de prudence : TypeNameHandling doit être utilisé avec prudence lors de la désérialisation d'un JSON externe, et un paramètre personnalisé SerializationBinder est recommandé pour la validation.
    • Examiner les données Modèle : Assurez-vous qu'aucun type de membre n'est objet, dynamique ou compatible avec les gadgets d'attaque.
    • Envisagez le classeur de sérialisation : Implémentez un SerializationBinder personnalisé pour contrôler strictement les types qui sont désérialisés.

    En conclusion, même si les conditions prévues atténuent considérablement les risques, il est important de noter qu'elles ne garantissent pas une sécurité totale. Le paramètre TypeNameHandling Auto de Json.Net peut encore potentiellement faciliter la création de gadgets d'attaque, nécessitant des précautions supplémentaires telles que des classeurs de sérialisation personnalisés.

    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