CA2310 : N’utilisez pas le désérialiseur non sécurisé NetDataContractSerializer

Propriété Value
Identificateur de la règle CA2310
Titre N’utilisez pas le désérialiseur non sécurisé NetDataContractSerializer
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Une méthode de désérialisation System.Runtime.Serialization.NetDataContractSerializer a été appelée ou référencée.

Description de la règle

Les désérialiseurs non sécurisés sont vulnérables lors de la désérialisation de données non approuvées. Un attaquant peut modifier les données sérialisées pour y inclure des types inattendus afin d’injecter des objets avec des effets secondaires malveillants. Une attaque contre un désérialiseur non sécurisé peut, par exemple, exécuter des commandes sur le système d’exploitation sous-jacent, communiquer sur le réseau ou supprimer des fichiers.

Cette règle recherche les appels ou références de méthode de désérialisation System.Runtime.Serialization.NetDataContractSerializer. Si vous souhaitez désérialiser uniquement lorsque la propriété Binder est définie pour restreindre les types, désactivez cette règle et activez les règles CA2311 et CA2312 à la place. La limitation des types qui peuvent être désérialisés peut aider à atténuer les attaques d’exécution de code à distance connues, mais votre désérialisation sera toujours vulnérable aux attaques par déni de service.

NetDataContractSerializer n’est pas sécurisé et ne peut pas être sécurisé. Pour plus d’informations, consultez le Guide de sécurité de BinaryFormatter.

Comment corriger les violations

  • Utilisez plutôt un sérialiseur sécurisé, et n’autorisez pas un attaquant à spécifier un type arbitraire à désérialiser. Pour plus d’informations, consultez les alternatives préférées.
  • Rendez les données sérialisées inviolables. Après la sérialisation, signez par chiffrement les données sérialisées. Avant la désérialisation, validez la signature de chiffrement. Protégez la clé de chiffrement contre la divulgation, et concevez un mécanisme de permutation des clés.
  • Cette option rend le code vulnérable aux attaques par déni de service et à d’éventuelles attaques d’exécution de code à distance à l’avenir. Pour plus d’informations, consultez le Guide de sécurité de BinaryFormatter. Restreignez les types désérialisés. Implémentez un System.Runtime.Serialization.SerializationBinder personnalisé. Avant la désérialisation, définissez la propriété Binder sur une instance de votre SerializationBinder personnalisé dans tous les chemins de code. Dans la méthode BindToType substituée, si le type est inattendu, levez une exception pour arrêter la désérialisation.

Quand supprimer les avertissements

NetDataContractSerializer n’est pas sécurisé et ne peut pas être sécurisé.

Exemples de pseudo-code

Violation

using System.IO;
using System.Runtime.Serialization;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        NetDataContractSerializer serializer = new NetDataContractSerializer();
        return serializer.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
        Return serializer.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2311 : Ne désérialisez pas sans définir d’abord NetDataContractSerializer.Binder

CA2312 : Vérifiez que NetDataContractSerializer.Binder est défini avant la désérialisation