次の方法で共有


CA5362: 逆シリアル化されたオブジェクト グラフで可能性のある参照サイクル

プロパティ
ルール ID CA5362
Title 逆シリアル化されたオブジェクト グラフで可能性のある参照サイクル
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

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