Бөлісу құралы:


CA2352: небезопасный набор данных или DataTable в сериализуемом типе может быть уязвим для атак удаленного выполнения кода

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

Причина

Класс или структура с пометкой SerializableAttribute содержит поле или свойство DataSet или DataTable и не имеет DesignerCategoryAttribute.

Правило CA2362 действует также при наличии DesignerCategoryAttribute.

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

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

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

Дополнительные сведения см. в статье Руководство по безопасности для DataSet и DataTable.

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

  • По возможности используйте Entity Framework, а не DataSet и DataTable.
  • Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.

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

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

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

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

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

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

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

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

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

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

Нарушение

using System.Data;
using System.Runtime.Serialization;

[Serializable]
public class MyClass
{
    public DataSet MyDataSet { get; set; }
}

CA2350: убедитесь в том, что данные, передаваемые в DataTable.ReadXml(), являются доверенными

CA2351: убедитесь, что данные, передаваемые в DataSet.ReadXml(), являются доверенными

CA2353: небезопасный набор данных или DataTable в сериализуемом типе

CA2354: небезопасный набор данных или DataTable в графе десериализированных объектов может быть уязвим для удаленной атаки на выполнение кода

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

CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов

CA2361: убедитесь, что автогенерированный класс, содержащий DataSet.ReadXml() не используется с ненадежными данными.

CA2362: Небезопасный DataSet или DataTable в автоматически сгенерированном сериализуемом типе может быть уязвим для атак удаленного выполнения кода.