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

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

Причина

Был вызван или указан метод десериализации System.Web.UI.ObjectStateFormatter.

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

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

Это правило находит вызовы метода десериализации System.Web.UI.ObjectStateFormatter или ссылки на него.

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

  • Если возможно, используйте безопасный сериализатор и не позволяйте злоумышленникам указывать произвольный тип для десериализации. Ниже приведены некоторые из более безопасных сериализаторов:

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

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

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

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

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

Нарушение

using System.IO;
using System.Web.UI;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        ObjectStateFormatter formatter = new ObjectStateFormatter();
        return formatter.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Web.UI

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