다음을 통해 공유


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

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

원인

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

규칙 설명

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

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

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

위반 문제를 해결하는 방법

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

경고를 표시하지 않는 경우

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

의사 코드 예제

위반

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

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

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

CA2301: BinaryFormatter.Binder를 먼저 설정하지 않고 BinaryFormatter.Deserialize를 호출하지 마세요.

CA2302: BinaryFormatter.Deserialize를 호출하기 전에 BinaryFormatter.Binder가 설정되어 있는지 확인합니다.