CA5362: Potenciální referenční cyklus v deserializovaném grafu objektů

Vlastnost Hodnota
ID pravidla CA5362
Název Potenciální cyklus odkazů v deserializovaném grafu objektů
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Třída označená System.SerializableAttribute pomocí pole nebo vlastnosti může odkazovat přímo nebo nepřímo na objekt obsahující, což umožňuje potenciální referenční cyklus.

Popis pravidla

Pokud dochází k deserializaci nedůvěryhodných dat, musí jakýkoli kód zpracovávající deserializovaný objektový graf počítat s referenčními cykly a zamezit tak nekonečným smyčkám. To zahrnuje jak kód, který je součástí zpětného volání deserializace, tak kód, který zpracovává graf objektu po dokončení deserializace. Jinak by útočník mohl provést útok typu Denial-of-Service s škodlivými daty obsahujícími referenční cyklus.

Toto pravidlo nemusí nutně znamenat ohrožení zabezpečení, ale pouze označí potenciální referenční cykly v deserializovaných grafech objektů.

Jak opravit porušení

Neserializujte třídu a odeberte SerializableAttribute. Nebo přepracujte aplikaci tak, aby samy odkazující členy mohly být odebráni ze serializovatelné třídy.

Kdy potlačit upozornění

Upozornění z tohoto pravidla je bezpečné potlačit, pokud:

  • Víte, že vstup je důvěryhodný. Vezměte v úvahu, že hranice důvěryhodnosti vaší aplikace a toky dat se můžou v průběhu času měnit.
  • Veškerý kód zpracovávající deserializovaná data detekuje a zpracovává referenční cykly bez nutnosti přejít do nekonečné smyčky nebo používat nadměrné prostředky.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Potenciální porušení referenčního cyklu

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

Řešení

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