CA2300:请勿使用不安全的反序列化程序 BinaryFormatte

2022-02-20 19:47:11 浏览数 (1)

规则 ID

CA2300

类别

安全性

修复是中断修复还是非中断修复

非中断

原因

调用或引用了 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.Binder 的情况下,请不要调用 BinaryFormatter.Deserialize

CA2302:在调用 BinaryFormatter.Deserialize 之前,确保设置 BinaryFormatter.Binder

0 人点赞