Share via


CA5360: 역직렬화에서 위험한 메서드를 호출하지 마세요.

속성
규칙 ID CA5360
타이틀 deserialization에서 위험한 메서드를 호출하지 마세요.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

역직렬화에서 다음의 위험한 메서드 중 하나를 호출합니다.

다음 요구 사항 중 하나를 충족하는 모든 메서드는 역직렬화 콜백일 수 있습니다.

규칙 설명

안전하지 않은 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);
    }
}