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