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
Règles associées
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