CA5360: не вызывайте опасные методы в десериализации

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

Причина

Вызов одного из следующих опасных методов в десериализации:

Все методы соответствуют одному из следующих требований, может быть обратным вызовом десериализации:

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

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

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

Удалите эти опасные методы из автоматически запускаемых обратных вызовов десериализации. Вызывайте опасные методы только после проверки входных данных.

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

Это правило можно безопасно отключить в следующих случаях.

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

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

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

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

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

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

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

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

Нарушение

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        File.Copy(sourceFileName, destFileName);
    }
}

Решение

using System;
using System.IO;
using System.Runtime.Serialization;

[Serializable()]
public class ExampleClass : IDeserializationCallback
{
    private string member;

    void IDeserializationCallback.OnDeserialization(Object sender)
    {
        var sourceFileName = "malicious file";
        var destFileName = "sensitive file";
        // Remove the potential dangerous operation.
        // File.Copy(sourceFileName, destFileName);
    }
}