CA5362:反序列化对象图中存在潜在引用循环

属性
规则 ID CA5362
标题 反序列化对象图中存在潜在引用循环
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 9 中默认启用

原因

使用 System.SerializableAttribute 标记的类具有字段或属性,可直接或间接引用包含的对象,从而允许潜在的引用循环。

规则说明

反序列化不受信任的数据时,处理反序列化对象图的任何代码都需要在处理引用循环时不进入无限循环。 这包括反序列化回叫中的一部分代码和在反序列化完成后处理对象图的代码。 否则攻击者可能会使用包含引用循环的恶意数据执行拒绝服务攻击。

此规则并不一定意味着存在漏洞,它只是在反序列化的对象图中标记潜在的引用循环。

如何解决冲突

请勿序列化类并删除 SerializableAttribute。 或者重新设计应用程序,以便可以从可序列化类中删除自引用成员。

何时禁止显示警告

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

  • 已知输入为受信任输入。 考虑应用程序的信任边界和数据流可能会随时间发生变化。
  • 处理反序列化数据的所有代码都会检测并处理引用循环,而不会进入无限循环或使用过多的资源。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

伪代码示例

潜在的引用循环冲突

using System;

[Serializable()]
class ExampleClass
{
    public ExampleClass ExampleProperty {get; set;}

    public int NormalProperty {get; set;}
}

class AnotherClass
{
    // The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
    public void AnotherMethod(ExampleClass ec)
    {
        while(ec != null)
        {
            Console.WriteLine(ec.ToString());
            ec = ec.ExampleProperty;
        }
    }
}

解决方案

using System;

[Serializable()]
class ExampleClass
{
    [NonSerialized]
    public ExampleClass ExampleProperty {get; set;}

    public int NormalProperty {get; set;}
}

class AnotherClass
{
    // The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
    public void AnotherMethod(ExampleClass ec)
    {
        while(ec != null)
        {
            Console.WriteLine(ec.ToString());
            ec = ec.ExampleProperty;
        }
    }
}