Newtonsoft JSON's TypeNameHandling
: une considération de sécurité pour JSON externe
La bibliothèque JSON de Newtonsoft propose TypeNameHandling
pour désérialiser les informations de type contenant JSON. Cependant, l'utilisation de cela avec des sources JSON externes non fiables présente des risques de sécurité importants.
Risques de sécurité de désérialisation JSON externe avec TypeNameHandling.All
sans SerializationBinder
, TypeNameHandling.All
permet au désérialiseur de créer des instances de tout type spécifié dans les métadonnées JSON. Cela ouvre une vulnérabilité aux acteurs malveillants qui pourraient envoyer des types nocifs présents dans votre application ou le framework .NET.
Exemple de vulnérabilité:
Considérons une classe simple Car
:
<code class="language-csharp">public class Car { public string Maker { get; set; } public string Model { get; set; } }</code>
Une charge utile JSON apparemment inoffensive:
<code class="language-json">{ "$type": "Car", "Maker": "Ford", "Model": "Explorer" }</code>
... désérialiserait correctement. Cependant, un acteur malveillant pourrait créer une charge utile ciblant une classe système comme System.CodeDom.Compiler.TempFileCollection
:
<code class="language-json">{ "$type": "System.CodeDom.Compiler.TempFileCollection", "BasePath": "%SYSTEMDRIVE%", "KeepFiles": "False", "TempDir": "%SYSTEMROOT%" }</code>
TempFileCollection
, une classe sérialisable gérant des fichiers temporaires, a un finalizer qui supprime des fichiers sur la collection de déchets. Une charge utile malveillante pourrait indiquer ce finalizer vers des fichiers arbitraires sur le système de la victime, entraînant une suppression involontaire des fichiers sans interaction utilisateur. Ce n'est qu'un exemple; De nombreuses autres classes système pourraient être exploitées de manière similaire.
Par conséquent, utilisez toujours un SerializationBinder
lorsque la désérialisation du JSON à partir de sources externes avec TypeNameHandling
a permis d'atténuer ces risques. Autoriser la désérialisation des types que vous faites explicitement confiance et contrôlez.
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!