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

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

Причина

Класс, помеченный атрибутом 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;

namespace ca5362
{
    [Serializable]
    class ExampleClass
    {
        public ExampleClass ExampleField;

        public int NormalProperty { get; set; }
    }

    class AnotherClass
    {
        // The argument passed in could be
        // `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
        public void AnotherMethod(ExampleClass ec)
        {
            while (ec != null)
            {
                Console.WriteLine(ec.ToString());
                ec = ec.ExampleField;
            }
        }
    }
}

Решение

[Serializable]
class ExampleClass
{
    [NonSerialized]
    public ExampleClass ExampleField;

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