Automatische Deserialisierung in .NET Framework Remoting
In Remotingsystemen, bei denen eine Typüberprüfung zur Laufzeit erfolgt, muss ein Remotestream deserialisiert werden, bevor er verwendet werden kann, und ein nicht autorisierter Client kann den Zeitpunkt der Deserialisierung ausnutzen. Zum Schutz vor dieser Art von Angriff bietet .NET Framework Remoting zwei Ebenen der automatischen Deserialisierung, Low und Full. Low (der Standardwert) schützt vor Deserialisierungsangriffen, indem nur die Typen deserialisiert werden, die den grundlegendsten Remotefunktionen zugeordnet sind: z. B. die automatische Deserialisierung von Typen der Remoteinfrastruktur, eine begrenzte Menge systemimplementierter Typen und eine Basismenge benutzerdefinierter Typen. Die Deserialisierungsebene Full unterstützt die automatische Deserialisierung aller Typen, die in allen Situationen beim Remoting unterstützt werden.
Warnung
Beschränken Sie die Sicherheitsmaßnahmen für die Anwendung nicht nur auf die Steuerung der Deserialisierung. Bei verteilten Anwendungen kann selbst eine starke Steuerung der Serialisierung nicht verhindern, dass nicht autorisierte Clients die Kommunikation abfangen und diese irgendwie verwenden, selbst wenn dabei lediglich die Daten anderen Personen angezeigt werden. Obwohl die Deserialisierungsebene Low einigen Schutz vor bestimmten Angriffsformen bietet, die auf der automatischen Serialisierung basieren, sollten Sie daher einen möglichst effizienten Schutz der Daten durch Authentifizierung und Verschlüsselung in Betracht ziehen. Weitere Informationen finden Sie unter Sicherheit.
In den folgenden Listen werden die Deserialisierungsebenen für .NET Framework Remoting beschrieben:
Low (default level)
Die Standarddeserialisierungsebene in .NET Framework Remoting unterstützt die Deserialisierung der folgenden Typen:
Objekte der Remoteinfrastruktur. Diese Typen sind für die grundlegende Durchführung von Remoting erforderlich.
Primitive Typen sowie Verweis- und Werttypen, die aus primitiven Typen zusammengesetzt sind.
Verweis- und Werttypen, die mit dem SerializableAttribute-Attribut gekennzeichnet sind, jedoch nicht die ISerializable-Schnittstelle implementieren.
Vom System bereitgestellte Typen, die ISerializable implementieren und für die nur die Serialisierung erforderlich ist.
Benutzerdefinierte Typen, die einen starken Namen aufweisen und sich in einer Assembly befinden, die nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut markiert ist.
Benutzerdefinierte Typen, die ISerializable implementieren und für die nur die Serialisierung erforderlich ist.
Typen, die die ILease-Schnittstelle implementieren und keine MarshalByRefObject-Objekte sind.
ObjRef-Objekte, die zur Aktivierung verwendet werden (um clientaktivierte Objekte zu unterstützen), d. h., der Client kann ObjRef nach der Rückgabe deserialisieren, der Server jedoch nicht.
Full
Die Deserialisierungsebene Full in .NET Framework Remoting unterstützt alle sonstigen Szenarios, einschließlich der Deserialisierung der folgenden zusätzlichen Typen:
Als Parameter übergebene ObjRef-Objekte.
Objekte, die die ISponsor-Schnittstelle implementieren.
Objekte, die durch die IContributeEnvoySink-Schnittstelle zwischen dem Proxy und der Clientpipeline eingefügt werden.
Als Parameter übergebene Delegattypen.
Objekte, die von MarshalByRefObject erben und als Parameter übergeben werden.
Als Parameter übergebene ISerializable-Typen.
Typen, die im globalen Assemblycache (GAC) gespeichert und nicht mit dem AllowPartiallyTrustedCallersAttribute-Attribut gekennzeichnet sind.
Wenn für die Anwendung Remotingfeatures verwendet werden müssen, die nur auf der Deserialisierungsebene Full verfügbar sind, müssen Sie den Authentifizierungstyp und die Verschlüsselungsebene angeben, die bei der Verwendung dieser erweiterten Funktionen in Remoteszenarios für gefährdete Ressourcen erforderlich sind.
Die Deserialisierungsebene kann programmgesteuert oder unter Verwendung einer Anwendungskonfigurationsdatei festgelegt werden.
Programmgesteuertes Festlegen der Deserialisierungsebene
Wenn die Deserialisierungsebene programmgesteuert festgelegt werden soll, übergeben Sie bei der Erstellung die folgende Eigenschaft an das SoapServerFormatterSinkProvider-Objekt oder das BinaryServerFormatterSinkProvider-Objekt. Das Remotingsystem legt anschließend den Wert auf das Formatierungsprogramm fest, wenn es in die Empfängerkette eingefügt wurde. Im folgenden Beispiel wird veranschaulicht, wie die Deserialisierungsebene in einer Hostanwendungsdomäne auf Full festgelegt wird.
// 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)
Festlegen der Deserialisierungsebene mit einer Anwendungskonfigurationsdatei
Wenn die Deserialisierungsebene mit einer Konfigurationsdatei festgelegt werden soll, müssen Sie das typeFilterLevel-Attribut des <formatter>-Elements explizit angeben. Obwohl dies normalerweise auf dem Server ausgeführt wird, müssen Sie dieses Attribut auch angeben, um die Deserialisierungsebene für alle Channels auf dem Client zu steuern, die für die Überwachung von Rückrufen registriert sind. Im folgenden Beispiel wird die Deserialisierungsebene für SoapFormatter und BinaryFormatter in der Anwendungsdomäne explizit auf Low festgelegt.
<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>
Siehe auch
Referenz
RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel