CA2326:请勿使用 None 以外的 TypeNameHandling 值

2022-02-27 09:04:55 浏览数 (1)

规则 ID

CA2326

类别

安全性

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

非中断

原因

如果满足以下任一条件,则会触发此规则:

引用了 None 以外的 Newtonsoft.Json.TypeNameHandling 枚举值。

将表示非零值的整数值赋给 TypeNameHandling 变量。

规则说明

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

此规则会查找 None 以外的 Newtonsoft.Json.TypeNameHandling 值。 如果仅希望在指定 Newtonsoft.Json.Serialization.ISerializationBinder 来限制反序列化类型时进行反序列化,请禁用此规则并启用规则 CA2327、CA2328、CA2329 和 CA2330。

如何解决冲突

如果可能,请使用 TypeNameHandling 的 None 值。

使序列化的数据免被篡改。 序列化后,对序列化的数据进行加密签名。 在反序列化之前,验证加密签名。 保护加密密钥不被泄露,并针对密钥轮换进行设计。

限制反序列化的类型。 实现自定义 Newtonsoft.Json.Serialization.ISerializationBinder。 在对 Json.NET 执行反序列化前,请确保在 Newtonsoft.Json.JsonSerializerSettings.SerializationBinder 属性中指定自定义 ISerializationBinder。 在已重写的 Newtonsoft.Json.Serialization.ISerializationBinder.BindToType 方法中,如果类型是非预期类型,会返回 null 或引发异常以停止反序列化。

如果限制反序列化的类型,则可能需要禁用此规则并启用规则 CA2327、CA2328、CA2329 和 CA2330。 规则 CA2327、CA2328、CA2329 和 CA2330 有助于确保在使用 None 以外的 TypeNameHandling值时使用 ISerializationBinder。

何时禁止显示警告

在以下情况下,禁止显示此规则的警告是安全的:

已知输入受到信任。 考虑到应用程序的信任边界和数据流可能会随时间发生变化。

已采取了如何修复冲突的某项预防措施。

伪代码示例

冲突

using Newtonsoft.Json;

public class ExampleClass

{

public JsonSerializerSettings Settings { get; }

public ExampleClass()

{

Settings = new JsonSerializerSettings();

Settings.TypeNameHandling = TypeNameHandling.All; // CA2326 violation.

}

}

Imports Newtonsoft.Json

Public Class ExampleClass

Public ReadOnly Property Settings() As JsonSerializerSettings

Public Sub New()

Settings = New JsonSerializerSettings()

Settings.TypeNameHandling = TypeNameHandling.All ' CA2326 violation.

End Sub

End Class

解决方案

using Newtonsoft.Json;

public class ExampleClass

{

public JsonSerializerSettings Settings { get; }

public ExampleClass()

{

Settings = new JsonSerializerSettings();

// The default value of Settings.TypeNameHandling is TypeNameHandling.None.

}

}

Imports Newtonsoft.Json

Public Class ExampleClass

Public ReadOnly Property Settings() As JsonSerializerSettings

Public Sub New()

Settings = New JsonSerializerSettings()

' The default value of Settings.TypeNameHandling is TypeNameHandling.None.

End Sub

End Class

相关规则

CA2327:不要使用不安全的 JsonSerializerSettings

CA2328:确保 JsonSerializerSettings 是安全的

CA2329:不要使用不安全的配置反序列化 JsonSerializer

CA2330:在反序列化时确保 JsonSerializer 具有安全配置

0 人点赞