CA2300 : N’utilisez pas le désérialiseur non sécurisé BinaryFormatter

Propriété Value
Identificateur de la règle CA2300
Titre N’utilisez pas le désérialiseur non sécurisé BinaryFormatter
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.Formatters.Binary.BinaryFormatter 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.Formatters.Binary.BinaryFormatter. 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 CA2301 et CA2302 à 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.

BinaryFormatter 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

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

Exemples de pseudo-code

Violation

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

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

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

CA2301 : N’appelez pas BinaryFormatter.Deserialize sans définir BinaryFormatter.Binder au préalable

CA2302 : Vérifiez que BinaryFormatter.Binder est défini avant d’appeler BinaryFormatter.Deserialize