CA2310:请勿使用不安全的反序列化程序 NetDataContractSerializer

属性
规则 ID CA2310
标题 请勿使用不安全的反序列化程序 NetDataContractSerializer
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

调用或引用了 System.Runtime.Serialization.NetDataContractSerializer 反序列化方法。

规则说明

反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。 攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 例如,针对不安全反序列化程序的攻击可以在基础操作系统上执行命令,通过网络进行通信,或删除文件。

此规则会查找 System.Runtime.Serialization.NetDataContractSerializer 反序列化方法调用或引用。 如果只希望在 Binder 属性设置为对类型进行限制时进行反序列化,请禁用此规则并改为启用规则 CA2311CA2312。 限制可以反序列化的类型可帮助缓解已知的远程代码执行攻击,但反序列化仍容易遭受拒绝服务攻击。

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