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;
        }
    }
}