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

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

Причина

Класс или структура с пометкой 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: небезопасный набор данных или DataTable в автоматическом сериализируемом типе могут быть уязвимы для атак удаленного выполнения кода.