CA5362: 反序列化对象图中可能的引用循环

属性 值
规则 ID CA5362
标题 反序列化对象图中存在潜在引用循环
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 10 中默认启用 否
适用的语言 C# 和 Visual Basic

原因

用 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;

namespace ca5362
{
    [Serializable]
    class ExampleClass
    {
        public ExampleClass ExampleField;

        public int NormalProperty { get; set; }
    }

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

解决方案

[Serializable]
class ExampleClass
{
    [NonSerialized]
    public ExampleClass ExampleField;

    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.ExampleField;
        }
    }
}