.NET Framework Remoting의 자동 Deserialization
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
런타임 형식 유효성 검사를 사용하는 원격 시스템은 원격 스트림을 deserialize하여 사용을 시작해야 하며 권한이 없는 클라이언트가 deserialization 순간을 이용하려고 할 수 있습니다. 이 공격 유형으로부터 보호하기 위해 .NET Framework Remoting은 자동 deserialization의 두 가지 수준인 Low 및 Full을 제공합니다. 기본값인 Low는 원격 인프라 형식, 시스템이 구현하는 제한된 형식 집합 및 기본 사용자 지정 형식 집합의 자동 deserialization 같은 가장 기본적인 원격 기능과 연결된 형식만 deserialize하여 deserialization 공격으로부터 보호합니다. Full deserialization 수준은 모든 상황에서 원격 기능이 지원하는 모든 형식의 자동 deserialization을 지원합니다.
주의: |
---|
Deserialization을 제어하는 것만으로 응용 프로그램의 보안을 유지할 수는 없습니다. 분산된 응용 프로그램에서는 serialization을 최고 수준으로 제어하더라도 권한이 없는 클라이언트가 통신을 차단하고, 단순히 데이터를 다른 사용자에게 보여 주는 것을 비롯하여 여러 가지 방법으로 악용할 수 있습니다. 따라서 Low deserialization 수준을 사용할 경우 자동 deserialization에 기반하여 특정 형식의 공격으로부터 어느 정도 보호받을 수 있지만 인증 및 암호화를 추가로 사용하여 데이터를 보호할지 여부를 결정해야 합니다. 자세한 내용은 보안을 참조하십시오. |
다음 목록에서는 .NET Framework Remoting deserialization 수준에 대해 설명합니다.
Low(기본 수준)
.NET Framework Remoting의 기본 deserialization 수준은 다음 형식의 deserialization을 지원합니다.
원격 인프라 개체. 원격 서비스가 기본 수준에서 작동하도록 하는 데 필요한 형식입니다.
기본 형식과 기본 형식으로 구성된 참조 및 값 형식
SerializableAttribute 특성으로 표시되었지만 ISerializable 인터페이스를 구현하지 않는 참조 및 값 형식
ISerializable을 구현하고 serialization 외의 다른 요구를 수행하지 않는 시스템 제공 형식
강력한 이름이 있고 AllowPartiallyTrustedCallersAttribute 특성으로 표시되지 않은 어셈블리에 있는 사용자 지정 형식
ISerializable을 구현하고 serialization 외의 다른 요구를 수행하지 않는 사용자 지정 형식
ILease 인터페이스를 구현하고 MarshalByRefObject 개체가 아닌 형식
클라이언트가 활성화한 개체를 지원하기 위해 활성화에 사용되는 ObjRef 개체. 즉, 클라이언트는 반환된 ObjRef를 deserialize할 수 있지만 서버는 deserialize할 수 없습니다.
Full
.NET Framework Remoting의 Full deserialization 수준은 다음 추가 형식의 deserialization을 비롯한 다른 모든 시나리오를 지원합니다.
매개 변수로 전달된 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 수준을 제어해야 합니다. 다음 예제에서는 응용 프로그램 도메인의 SoapFormatter 및 BinaryFormatter 둘 다에 대해 명시적으로 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