| 속성 | 값 |
|---|---|
| 규칙 ID | CA5362 |
| 제목 | 역직렬화된 개체 그래프의 잠재적 참조 주기 |
| 범주 | 보안 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 아니요 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
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;
}
}
}
.NET