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