다음을 통해 공유


.NET Framework Remoting에서의 자동 Deserialization

런타임 형식 유효성 검사에 의존하는 원격 시스템에서는 원격 스트림을 deserialize해야 원격 스트림을 사용할 수 있게 됩니다. 그러나 권한이 없는 클라이언트가 이러한 deserialization 순간을 이용하려고 할 수 있습니다. 이러한 형식의 공격으로부터 보호하기 위해 .NET Framework Remoting에서는 LowFull 수준의 자동 deserialization을 제공합니다. Low(기본값) 수준에서는 가장 기본적인 원격 기능과 연관된 형식만 deserialize함으로써 deserialization 공격으로부터 보호합니다. 예를 들어, 원격 인프라 형식, 시스템 구현 형식의 제한된 집합 및 사용자 지정 형식의 기본 집합만 자동으로 deserialize합니다. Full deserialization 수준에서는 모든 상황에서 원격 서비스가 지원하는 모든 형식의 자동 deserialization을 지원합니다.

경고

deserialization을 제어하는 것이 응용 프로그램에서 필요한 유일한 보안책이라고 생각하지는 마십시오. 분산 응용 프로그램에서는 serialization에 대한 제어 정도가 높아도 권한이 없는 클라이언트가 통신을 가로채서 다른 사람에게 데이터를 보여 주는 등의 용도로 이용하는 것을 막지 못합니다. 따라서 deserialization 수준을 Low로 설정할 경우 자동 deserialization을 이용하는 특정 유형의 공격으로부터 어느 정도는 보호할 수 있지만 데이터를 완전히 보호하려면 인증과 암호화를 사용할지 여부를 고려해야 합니다. 자세한 내용은 보안을 참조하십시오.

다음 목록에서는 .NET Framework Remoting의 deserialization 수준에 대해 설명합니다.

  • Low(기본 수준)

    .NET Framework Remoting의 기본 deserialization 수준에서는 다음과 같은 형식을 deserialize할 수 있습니다.

    • 원격 인프라 개체 이 개체는 원격 서비스가 기본 수준으로 작동하도록 하는 데 필요한 형식입니다.

    • 기본 형식과, 기본 형식을 구성하는 참조 및 값 형식

    • SerializableAttribute 특성으로 표시되었지만 ISerializable 인터페이스를 구현하지 않는 참조 및 값 형식

    • ISerializable을 구현하며 serialization 외의 다른 처리는 필요로 하지 않는 시스템 제공 형식

    • 강력한 이름을 갖고 있으며 AllowPartiallyTrustedCallersAttribute 특성으로 표시되지 않은 어셈블리에 있는 사용자 지정 형식

    • ISerializable을 구현하며 serialization 외의 다른 처리는 필요로 하지 않는 사용자 지정 형식

    • ILease 인터페이스를 구현하며 MarshalByRefObject 개체가 아닌 형식

    • 클라이언트 활성 개체를 지원하기 위해 활성화에 사용되는 ObjRef 개체. 즉, 클라이언트에서는 반환된 ObjRef를 deserialize할 수 있지만 서버에서는 deserialize할 수 없습니다.

  • Full

    .NET Framework Remoting의 Full deserialization 수준에서는 다음과 같은 추가 형식을 비롯한 다른 모든 시나리오를 deserialize할 수 있습니다.

    • 매개 변수로 전달되는 ObjRef 개체

    • ISponsor 인터페이스를 구현하는 개체

    • IContributeEnvoySink 인터페이스에 의해 프록시와 클라이언트 파이프라인 사이에 삽입되는 개체

    • 매개 변수로 전달되는 대리자 형식

    • 매개 변수로 전달되는 MarshalByRefObject에서 상속된 개체

    • 매개 변수로 전달되는 ISerializable 형식

    • GAC에 저장되어 있으며 AllowPartiallyTrustedCallersAttribute 특성으로 표시되지 않은 형식

    사용자의 응용 프로그램에서 Full deserialization 수준에서만 사용할 수 있는 원격 기능을 사용해야 할 경우에는 원격 시나리오에서 이러한 고급 기능을 사용함으로써 공격당할 수 있는 리소스를 보호하는 데 필요한 인증 유형과 암호화 수준을 제공해야 합니다.

deserialization 수준은 프로그래밍 방식으로 설정하거나 응용 프로그램 구성 파일을 사용하여 설정할 수 있습니다.

프로그래밍 방식으로 Deserialization 수준 설정

프로그래밍 방식으로 deserialization 수준을 설정하려면 SoapServerFormatterSinkProvider 개체나 BinaryServerFormatterSinkProvider 개체를 만들 때 다음 속성을 개체에 전달합니다. 그러면 원격 시스템에서는 포맷터가 싱크 체인에 삽입될 때 포맷터에 해당 값을 설정합니다. 다음 예에서는 호스트 응용 프로그램 도메인에서 deserialization 수준을 Full로 설정하는 방법을 보여 줍니다.

// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 8085;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel chan = new TcpChannel(props, null, provider);
' Creating a custom formatter for your TcpChannel sink chain.
Dim provider As New BinaryServerFormatterSinkProvider()
provider.TypeFilterLevel = TypeFilterLevel.Full
' Creating the IDictionary to set the port on the channel instance.
Dim props As IDictionary = New Hashtable()
props("port") = 8085
' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
Dim chan As New TcpChannel(props, DBNull.Value, provider)

응용 프로그램 구성 파일을 사용하여 Deserialization 수준 설정

구성 파일을 사용하여 deserialization 수준을 설정하려면 <formatter> 요소의 typeFilterLevel 특성을 명시적으로 지정해야 합니다. 이것은 일반적으로 서버측에서 수행되지만, 콜백을 수신하도록 등록된 클라이언트의 채널에 대한 deserialization 수준을 제어하기 위해서도 이 특성을 지정해야 합니다. 다음 예에서는 응용 프로그램 도메인의 SoapFormatterBinaryFormatter에 대한 deserialization 수준을 모두 Low로 명시적으로 설정합니다.

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown 
type="ServiceType, common" 
objectUri="ServiceType.soap" 
mode="Singleton" 
/>
</service>
<channels>
<channel ref="http">
<serverProviders> 
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel=Low />
<formatter ref="binary" typeFilterLevel=Low />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

참고 항목

참조

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

개념

원격 응용 프로그램의 구성