CA2300: не используйте небезопасный десериализатор BinaryFormatter

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

Причина

Был вызван или указан метод десериализации System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.

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

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

Это правило находит вызовы метода десериализации System.Runtime.Serialization.Formatters.Binary.BinaryFormatter или ссылки на него. Если требуется выполнить десериализацию только в том случае, если свойство Binder задано для ограничения типов, отключите это правило и включите вместо него правила CA2301 и CA2302. Ограничение типов, которые могут быть десериализованы, поможет предотвратить известные атаки удаленного выполнения кода, но десериализация по-прежнему будет подвержена атакам типа "отказ в обслуживании".

Тип BinaryFormatter является небезопасным, и его безопасность нельзя обеспечить. Дополнительные сведения см. в статье Руководство по безопасности BinaryFormatter.

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

  • Используйте безопасный сериализатор и не позволяйте злоумышленникам указывать произвольный тип для десериализации. Дополнительные сведения см. в разделе Рекомендуемые альтернативы.
  • Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
  • Этот параметр делает код уязвимым к атакам типа "отказ в обслуживании" и возможным атакам удаленного выполнения кода в будущем. Дополнительные сведения см. в статье Руководство по безопасности BinaryFormatter. Ограничьте десериализованные типы. Реализуйте пользовательский System.Runtime.Serialization.SerializationBinder. Перед десериализацией задайте свойство Binder для экземпляра пользовательского класса SerializationBinder во всех путях кода. В переопределенном методе BindToType, если тип является непредвиденным, вызовите исключение для отмены десериализации.

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

Тип BinaryFormatter является небезопасным, и его безопасность нельзя обеспечить.

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

Нарушение

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        return formatter.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim formatter As BinaryFormatter = New BinaryFormatter()
        Return formatter.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2301: не вызывайте BinaryFormatter.Deserialize без первого задания BinaryFormatter.Binder

CA2302: убедитесь, что BinaryFormatter.Binder задан перед вызовом BinaryFormatter.Deserialize