CA5360: 역직렬화에서 위험한 메서드를 호출하지 마세요.
속성 | 값 |
---|---|
규칙 ID | CA5360 |
제목 | deserialization에서 위험한 메서드를 호출하지 마세요. |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
역직렬화에서 다음의 위험한 메서드 중 하나를 호출합니다.
- System.IO.Directory.Delete
- System.IO.DirectoryInfo.Delete
- System.IO.File.AppendAllLines
- System.IO.File.AppendAllText
- System.IO.File.AppendText
- System.IO.File.Copy
- System.IO.File.Delete
- System.IO.File.WriteAllBytes
- System.IO.File.WriteAllLines
- System.IO.File.WriteAllText
- System.IO.FileInfo.Delete
- System.IO.Log.LogStore.Delete
- System.Reflection.Assembly.GetLoadedModules
- System.Reflection.Assembly.Load
- System.Reflection.Assembly.LoadFrom
- System.Reflection.Assembly.LoadFile
- System.Reflection.Assembly.LoadModule
- System.Reflection.Assembly.LoadWithPartialName
- System.Reflection.Assembly.ReflectionOnlyLoad
- System.Reflection.Assembly.ReflectionOnlyLoadFrom
- System.Reflection.Assembly.UnsafeLoadFrom
다음 요구 사항 중 하나를 충족하는 모든 메서드는 역직렬화 콜백일 수 있습니다.
- System.Runtime.Serialization.OnDeserializingAttribute로 표시됩니다.
- System.Runtime.Serialization.OnDeserializedAttribute로 표시됩니다.
- System.Runtime.Serialization.IDeserializationCallback.OnDeserialization을 구현합니다.
- System.IDisposable.Dispose을 구현합니다.
- 소멸자입니다.
규칙 설명
안전하지 않은 deserialization은 신뢰할 수 없는 데이터를 사용하여 애플리케이션의 논리를 남용하거나 DoS(서비스 거부) 공격을 가하거나 역직렬화될 때 임의 코드를 실행하는 경우 발생하는 취약성입니다. 악의적인 사용자가 제어하는 신뢰할 수 없는 데이터를 애플리케이션에서 역직렬화할 때 이러한 deserialization 기능을 남용하는 경우가 많습니다. 특히 deserialization 중에 위험한 메서드를 호출합니다. 안전하지 않은 deserialization 공격에 성공하면 공격자가 DoS 공격, 인증 바이패스, 원격 코드 실행과 같은 공격을 수행할 수 있습니다.
위반 문제를 해결하는 방법
이러한 위험한 메서드를 제거하여 deserialization 콜백을 자동으로 실행합니다. 입력의 유효성을 검사한 후에만 위험한 메서드를 호출합니다.
경고를 표시하지 않는 경우
다음 경우에는 이 규칙을 표시하지 않아도 됩니다.
- 입력을 신뢰할 수 있습니다. 애플리케이션의 트러스트 경계 및 데이터 흐름이 시간이 지남에 따라 달라질 수 있다는 점을 고려합니다.
- 직렬화된 데이터 변조가 방지되어 있습니다. serialization 후에 직렬화된 데이터에 암호화된 방식으로 서명합니다. deserialization 전에 암호화 시그니처의 유효성을 검사합니다. 암호화 키가 공개되지 않도록 보호하고 키 순환을 설계합니다.
- 데이터가 애플리케이션에 안전한 것으로 확인됩니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#pragma warning disable CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none
으로 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
의사 코드 예제
위반
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
File.Copy(sourceFileName, destFileName);
}
}
해결 방법
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
// Remove the potential dangerous operation.
// File.Copy(sourceFileName, destFileName);
}
}
.NET