CA5362: 역직렬화된 개체 그래프의 잠재적 참조 주기

속성
규칙 ID CA5362
타이틀 역직렬화된 개체 그래프의 잠재적 참조 주기
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

System.SerializableAttribute로 표시된 클래스에 필드가 있거나 속성이 포함하는 개체를 직접적으로나 간접적으로 참조하여 잠재적 참조 주기를 허용합니다.

규칙 설명

신뢰할 수 없는 데이터를 역직렬화하는 경우 역직렬화된 개체 그래프를 처리하는 모든 코드가 무한 루프로 이동하지 않고 참조 주기를 처리해야 합니다. 여기에는 deserialization 콜백의 일부인 코드와 deserialization 완료 후 개체 그래프를 처리하는 코드가 모두 포함됩니다. 그렇지 않으면 공격자가 참조 주기를 포함하는 악성 데이터를 사용하여 서비스 거부 공격을 수행할 수 있습니다.

이 규칙은 반드시 취약성이 있음을 의미하지는 않지만 역직렬화된 개체 그래프의 잠재적 참조 주기에 플래그를 지정합니다.

위반 문제를 해결하는 방법

클래스를 직렬화하지 않고 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;
        }
    }
}