CA5362 : Cycle de référence potentiel dans le graphe d’objets désérialisé
Propriété | Value |
---|---|
Identificateur de la règle | CA5362 |
Titre | Cycle de référence potentiel dans le graphe d’objets désérialisé |
Catégorie | Sécurité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Une classe marquée avec le System.SerializableAttribute a un champ, ou une propriété peut faire référence à l’objet conteneur directement ou indirectement, ce qui permet un cycle de référence potentiel.
Description de la règle
Si vous désérialisez des données non approuvées, tout code traitant le graphe d’objets désérialisé doit gérer des cycles de référence sans passer par des boucles infinies. Cela inclut à la fois le code qui fait partie d’un rappel de désérialisation et le code qui traite le graphe d’objets une fois la désérialisation terminée. Sinon, un attaquant pourrait effectuer une attaque par déni de service avec des données malveillantes contenant un cycle de référence.
Cette règle ne signifie pas nécessairement qu’il existe une vulnérabilité, mais signale simplement les cycles de référence potentiels dans les graphiques d’objets désérialisés.
Comment corriger les violations
Ne sérialisez pas la classe et supprimez le SerializableAttribute. Vous pouvez également redéfinir votre application afin que les membres auto-référencés puissent être supprimés de la classe sérialisable.
Quand supprimer les avertissements
Vous pouvez supprimer sans risque un avertissement de cette règle si :
- Vous savez que l’entrée est approuvée. Considérez que la limite d’approbation et les flux de données de votre application peuvent changer au fil du temps.
- Tout le code traitant les données désérialisées détecte et gère les cycles de référence sans passer par une boucle infinie ou en utilisant des ressources excessives.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Exemples de pseudo-code
Infraction potentielle du cycle de référence
using System;
[Serializable()]
class ExampleClass
{
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}
Solution
using System;
[Serializable()]
class ExampleClass
{
[NonSerialized]
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}