CA5362: Potentiële referentiecyclus in gedeserialiseerde object grafiek

Eigenschap Waarde
Regel-id CA5362
Titel Mogelijke referentiecyclus in de grafiek met gedeserialiseerde objecten
Categorie Beveiliging
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

Oorzaak

Een klasse die is gemarkeerd met het veld of de System.SerializableAttribute eigenschap, kan rechtstreeks of indirect verwijzen naar het bijbehorende object, waardoor een mogelijke referentiecyclus mogelijk is.

Beschrijving van regel

Bij het deserialiseren van niet-vertrouwde gegevens moet elke code die de gedeserialiseerde objectgraaf verwerkt omgaan met referentiecycli zonder in oneindige lussen terecht te komen. Dit omvat zowel code die deel uitmaakt van een callback voor deserialisatie als code die de objectgrafiek verwerkt nadat deserialisatie is voltooid. Anders kan een aanvaller een Denial-of-Service-aanval uitvoeren met schadelijke gegevens die een referentiecyclus bevatten.

Deze regel betekent niet noodzakelijkerwijs dat er een beveiligingsprobleem is, maar markeert alleen mogelijke referentiecycli in ontserialiseerde objectgrafieken.

Hoe schendingen op te lossen

Serialiseer de klasse niet en verwijder de SerializableAttribute. U kunt uw toepassing ook opnieuw ontwerpen, zodat de zelfverwijzende leden uit de serialiseerbare klasse kunnen worden verwijderd.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als:

  • U weet dat de invoer betrouwbaar is. Houd er rekening mee dat de vertrouwensgrens en gegevensstromen van uw toepassing na verloop van tijd kunnen veranderen.
  • Alle code die de gedeserialiseerde gegevens verwerkt, detecteert en verwerkt referentiecycli zonder in een oneindige lus te gaan of te veel resources te gebruiken.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none

Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Voorbeelden van pseudocode

Mogelijke schending van referentiecyclus

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

Oplossing

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