CA5362: потенциальный цикл ссылок в графе десериализированных объектов

Свойство Значение
Идентификатор правила CA5362
Заголовок потенциальный цикл ссылок в графе десериализованных объектов
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Класс, помеченный атрибутом System.SerializableAttribute, имеет поле или свойство, которое может ссылаться, непосредственно или косвенно, на содержащий его объект, разрешая потенциальный цикл ссылки.

Описание правила

При десериализации недоверенных данных любой код, обрабатывающий десериализованный граф объекта, должен обрабатывать циклы ссылок без перехода в бесконечные циклы. Сюда входит код, который является частью обратного вызова десериализации, и код, обрабатывающий граф объекта после завершения десериализации. В противном случае злоумышленник может выполнить атаку типа "отказ в обслуживании" с вредоносными данными, содержащими цикл ссылок.

Это правило необязательно означает наличие уязвимости, но просто помечает потенциальные циклы ссылок в графах десериализованных объектов.

Устранение нарушений

Не следует сериализовать класс и удалять SerializableAttribute. Также можно переконструировать приложение таким образом, чтобы члены, которые ссылаются на себя, могли быть удалены из сериализуемого класса.

Когда лучше отключить предупреждения

Можно отключить вывод предупреждений для этого правила в следующих случаях:

  • Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
  • Весь код, обрабатывающий десериализованные данные, обнаруживает и обрабатывает циклы ссылок, не прибегая к бесконечному циклу или чрезмерному использованию ресурсов.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Потенциальное нарушение цикла ссылок

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

Решение

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