Udostępnij za pośrednictwem


CA5362: Potencjalny cykl odniesienia w deserializowanym grafie obiektu

Właściwości Wartość
Identyfikator reguły CA5362
Tytuł Potencjalny cykl odwołań w grafie obiektu deserializowanego
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Klasa oznaczona System.SerializableAttribute polem lub właściwością może odwoływać się do obiektu zawierającego bezpośrednio lub pośrednio, co pozwala na potencjalny cykl odwołania.

Opis reguły

Jeśli deserializowanie niezaufanych danych, każdy kod przetwarzający deserializowany graf obiektu musi obsługiwać cykle odwołań bez przechodzenia do nieskończonych pętli. Obejmuje to zarówno kod, który jest częścią wywołania zwrotnego deserializacji, jak i kodu, który przetwarza graf obiektu po zakończeniu deserializacji. W przeciwnym razie osoba atakująca może wykonać atak typu "odmowa usługi" ze złośliwymi danymi zawierającymi cykl referencyjny.

Ta reguła nie musi oznaczać luki w zabezpieczeniach, ale po prostu flaguje potencjalne cykle odwołań w deserializacji grafów obiektów.

Jak naprawić naruszenia

Nie serializuj klasy i usuń element SerializableAttribute. Możesz też przeprojektować aplikację, aby można było usunąć elementy członkowskie z możliwością serializacji.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli:

  • Wiesz, że dane wejściowe są zaufane. Należy wziąć pod uwagę, że granica zaufania aplikacji i przepływy danych mogą ulec zmianie w czasie.
  • Cały kod przetwarzający dane deserializowane wykrywa cykle odwołań i obsługuje je bez przechodzenia do nieskończonej pętli lub używania nadmiernych zasobów.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Potencjalne naruszenie cyklu referencyjnego

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

Rozwiązanie

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