CA2120 : Sécurisez les constructeurs de sérialisation
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Oui |
Cause
Le type implémente l'interface ISerializable, n'est ni un délégué, ni une interface, et est déclaré dans un assembly qui autorise des appelants dotés d'une confiance partielle.Le type dispose d'un constructeur qui accepte un objet SerializationInfo et un objet StreamingContext (la signature du constructeur de sérialisation).Ce constructeur n'est pas sécurisé par une vérification de la sécurité, mais au moins un des constructeurs normaux dans le type est sécurisé.
Description de la règle
Cette règle est pertinente pour les types qui prennent en charge la sérialisation personnalisée.Un type prend en charge la sérialisation personnalisée s'il implémente l'interface ISerializable.Le constructeur de sérialisation est requis et est utilisé pour désérialiser ou recréer des objets qui ont été sérialisés à l'aide de la méthode ISerializable.GetObjectData.Sachant que le constructeur de sérialisation attribue et initialise des objets, les vérifications de sécurité en vigueur sur les constructeurs normaux doivent également être présentes sur le constructeur de sérialisation.Si vous violez cette règle, les appelants qui ne peuvent normalement pas créer d'instance pourraient utiliser le constructeur de sérialisation pour le faire.
Comment corriger les violations
Pour corriger une violation de cette règle, protégez le constructeur de sérialisation avec des demandes de sécurité identiques à celles qui protègent d'autres constructeurs.
Quand supprimer les avertissements
Ne supprimez aucune violation de la règle.
Exemple
L'exemple suivant présente un type qui enfreint la règle.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security;
using System.Security.Permissions;
[assembly: AllowPartiallyTrustedCallersAttribute()]
namespace SecurityRulesLibrary
{
[Serializable]
public class SerializationConstructorsRequireSecurity : ISerializable
{
private int n1;
// This is a regular constructor secured by a demand.
[FileIOPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public SerializationConstructorsRequireSecurity ()
{
n1 = -1;
}
// This is the serialization constructor.
// Violates rule: SecureSerializationConstructors.
protected SerializationConstructorsRequireSecurity (SerializationInfo info, StreamingContext context)
{
n1 = (int) info.GetValue("n1", typeof(int));
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
Règles connexes
CA2229 : Implémentez des constructeurs de sérialisation
CA2237 : Marquer les types ISerializable avec SerializableAttribute