Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2310 |
| Заголовок | Не используйте небезопасный десериализатор NetDataContractSerializer |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Был вызван или упомянут метод десериализации System.Runtime.Serialization.NetDataContractSerializer.
Описание правила
Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. Атака против небезопасного десериализатора может, например, выполнять команды в базовой операционной системе, отсылать сообщения по сети или удалять файлы.
Это правило находит вызовы метода десериализации System.Runtime.Serialization.NetDataContractSerializer или ссылки на него. Если требуется выполнить десериализацию только в том случае, если свойство Binder задано для ограничения типов, отключите это правило и включите вместо него правила CA2311 и CA2312. Ограничение типов, которые могут быть десериализованы, поможет предотвратить известные атаки удаленного выполнения кода, но десериализация по-прежнему будет подвержена атакам типа "отказ в обслуживании".
Тип NetDataContractSerializer является небезопасным, и его безопасность нельзя обеспечить. Дополнительные сведения см. в статье Руководство по безопасности BinaryFormatter.
Устранение нарушений
- Используйте безопасный сериализатор и не позволяйте злоумышленникам указывать произвольный тип для десериализации. Дополнительные сведения см. в разделе Рекомендуемые альтернативы.
- Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
- Этот параметр делает код уязвимым к атакам типа "отказ в обслуживании" и возможным атакам удаленного выполнения кода в будущем. Дополнительные сведения см. в статье Руководство по безопасности BinaryFormatter. Ограничьте десериализованные типы. Реализуйте пользовательский System.Runtime.Serialization.SerializationBinder. Перед десериализацией задайте свойство
Binderдля экземпляра пользовательского класса SerializationBinder во всех путях кода. В переопределенном методе BindToType, если тип является неожиданным, вызовите исключение для остановки десериализации.
Когда лучше отключить предупреждения
Тип NetDataContractSerializer является небезопасным, и его безопасность нельзя обеспечить.
Примеры псевдокода
Нарушение
using System.IO;
using System.Runtime.Serialization;
public class ExampleClass
{
public object MyDeserialize(byte[] bytes)
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
return serializer.Deserialize(new MemoryStream(bytes));
}
}
Imports System.IO
Imports System.Runtime.Serialization
Public Class ExampleClass
Public Function MyDeserialize(bytes As Byte()) As Object
Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
Return serializer.Deserialize(New MemoryStream(bytes))
End Function
End Class
Связанные правила
CA2311: Не десериализировать, не установив NetDataContractSerializer.Binder
CA2312: Убедитесь в том, что NetDataContractSerializer.Binder установлен перед десериализацией