CA2315:请勿使用不安全的反序列化程序 ObjectStateFormatter
属性 | 值 |
---|---|
规则 ID | CA2315 |
标题 | 请勿使用不安全的反序列化程序 ObjectStateFormatter |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
原因
调用或引用了 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
- Newtonsoft Json.NET - 使用 TypeNameHandling.None。 如果必须为 TypeNameHandling 使用其他值,请将反序列化的类型限制为具有自定义 ISerializationBinder 的预期列表。
- 协议缓冲区
使序列化的数据免被篡改。 序列化后,对序列化的数据进行加密签名。 在反序列化之前,验证加密签名。 保护加密密钥不被泄露,并针对密钥轮换进行设计。
何时禁止显示警告
在以下情况下,禁止显示此规则的警告是安全的:
- 已知输入为受信任输入。 考虑应用程序的信任边界和数据流可能会随时间发生变化。
- 你采取了如何修复冲突的某项预防措施。
伪代码示例
冲突
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