CA2310: 안전하지 않은 역직렬 변환기 NetDataContractSerializer를 사용하지 마세요.

속성
규칙 ID CA2310
타이틀 안전하지 않은 역직렬 변환기 NetDataContractSerializer를 사용하지 마세요.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

System.Runtime.Serialization.NetDataContractSerializer deserialization 메서드를 호출했거나 참조했습니다.

규칙 설명

안전하지 않은 역직렬 변환기는 신뢰할 수 없는 데이터를 역직렬화할 때 취약합니다. 공격자는 예기치 않은 형식을 포함하도록 직렬화된 데이터를 수정하여 악의적인 부작용을 개체에 주입할 수 있습니다. 예를 들어 안전하지 않은 역직렬 변환기에 대한 공격은 기본 운영 체제에서 명령을 실행하거나, 네트워크를 통해 통신하거나, 파일을 삭제할 수 있습니다.

이 규칙은 System.Runtime.Serialization.NetDataContractSerializer deserialization 메서드 호출 또는 참조를 찾습니다. Binder 속성이 형식을 제한하도록 설정된 경우에만 역직렬화하려면 이 규칙을 사용하지 않도록 설정하고 CA2311CA2312 규칙을 대신 사용하도록 설정합니다. 역직렬화할 수 있는 형식을 제한하면 알려진 원격 코드 실행 공격을 완화하는 데 도움이 되지만 deserialization은 서비스 거부 공격에 취약합니다.

NetDataContractSerializer는 안전하지 않으며 안전하게 할 수 없습니다. 자세한 내용은 BinaryFormatter 보안 가이드를 참조하세요.

위반 문제를 해결하는 방법

  • 보안 직렬 변환기를 대신 사용하고 공격자가 역직렬화할 임의 형식을 지정할 수 없도록 합니다. 자세한 내용은 기본 설정 대안을 참조하세요.
  • 직렬화된 데이터를 변조 방지로 설정합니다. serialization 후에 직렬화된 데이터에 암호화된 방식으로 서명합니다. deserialization 전에 암호화 시그니처의 유효성을 검사합니다. 암호화 키가 공개되지 않도록 보호하고 키 순환을 설계합니다.
  • 이 옵션을 사용하면 코드가 서비스 거부 공격에 취약해지고 향후 원격 코드 실행 공격이 발생할 수 있습니다. 자세한 내용은 BinaryFormatter 보안 가이드를 참조하세요. 역직렬화된 형식을 제한합니다. 사용자 지정 System.Runtime.Serialization.SerializationBinder를 구현합니다. 역직렬화하기 전에 모든 코드 경로에서 Binder 속성을 사용자 지정 SerializationBinder 인스턴스로 설정합니다. 재정의된 BindToType 메서드에서 형식이 예기치 않은 형식인 경우 예외를 throw하여 deserialization을 중지합니다.

경고를 표시하지 않는 경우

NetDataContractSerializer는 안전하지 않으며 안전하게 할 수 없습니다.

의사 코드 예제

위반

using System.IO;
using System.Runtime.Serialization;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        NetDataContractSerializer serializer = new NetDataContractSerializer();
        return serializer.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
        Return serializer.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2311: 먼저 NetDataContractSerializer.Binder를 설정하지 않고 역직렬화하지 마세요.

CA2312: 역직렬화하기 전에 NetDataContractSerializer.Binder가 설정되어 있는지 확인합니다.