CA2315: не используйте небезопасный десериализатор ObjectStateFormatter
Свойство | Значение |
---|---|
Идентификатор правила | CA2315 |
Заголовок | Не используйте небезопасный десериализатор ObjectStateFormatter |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Был вызван или указан метод десериализации System.Web.UI.ObjectStateFormatter.
Описание правила
Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. Атака против небезопасного десериализатора может, например, выполнять команды в базовой операционной системе, отсылать сообщения по сети или удалять файлы.
Это правило находит вызовы метода десериализации System.Web.UI.ObjectStateFormatter или ссылки на него.
Устранение нарушений
Если возможно, используйте безопасный сериализатор и не позволяйте злоумышленникам указывать произвольный тип для десериализации. Ниже приведены некоторые из более безопасных сериализаторов:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer — никогда не использовать System.Web.Script.Serialization.SimpleTypeResolver. Если необходимо использовать сопоставитель типов, ограничьте десериализованные типы ожидаемым списком.
- System.Xml.Serialization.XmlSerializer
- Json.NET Newtonsoft — использовать TypeNameHandling.None. Если необходимо использовать другое значение для TypeNameHandling, ограничьте десериализованные типы ожидаемым списком с помощью настраиваемого ISerializationBinder.
- Protocol Buffers
Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.
Примеры псевдокода
Нарушение
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