"Demand" und "LinkDemand"
Aktualisiert: November 2007
Die deklarative Sicherheit stellt zwei Formen der Sicherheitsüberprüfung bereit, die einander zwar ähneln, jedoch sehr unterschiedliche Überprüfungen ausgeführen. Sie sollten beide Formen kennen, denn die Auswahl der falschen Methode kann zu Sicherheitslücken oder einem Leistungsabfall führen. Weitere Informationen finden Sie unter Sicherheitsforderungen.
Die deklarative Sicherheit stellt folgende Sicherheitsüberprüfungen bereit:
Demand gibt den Stackwalk für die Codezugriffssicherheit an. Alle Aufrufer für den Stapel benötigen die angegebene Berechtigung oder Identität. Demand tritt bei jedem Aufruf auf, da der Stapel unterschiedliche Aufrufer enthalten kann. Beim wiederholten Aufrufen einer Methode wird jedes Mal die Sicherheitsüberprüfung ausgeführt. Demand stellt einen wirksamen Schutz gegen Täuschungsmanöver dar, da zugreifender Code ohne die entsprechenden Berechtigungen erkannt wird.
LinkDemand tritt bei der JIT-Kompilierung (Just-in-Time) auf. Dabei wird nur der direkte Aufrufer überprüft. Bei dieser Sicherheitsüberprüfung wird der Aufrufer des Aufrufers nicht überprüft. Nach erfolgreichem Abschluss dieser Überprüfung werden keine weiteren Sicherheitsmaßnahmen ergriffen, auch wenn der Aufrufer weitere Aufrufe vornimmt. Daher besteht auch kein Schutz vor Täuschungsmanövern. Mit LinkDemand kann jeglicher Code, der die Sicherheitsüberprüfung erfolgreich bestanden hat und auf den Code verweisen kann, ein Sicherheitsrisiko darstellen, da bösartiger Code über den Code mit der entsprechenden Berechtigung Aufrufe vornehmen kann. Sie sollten LinkDemand daher nur verwenden, wenn Sie alle potenziellen Risiken sicher ausgeschlossen haben.
Die zusätzlichen Vorsichtsmaßnahmen bei der Verwendung von LinkDemand müssen einzeln programmiert werden, erzwungen werden sie über das Sicherheitssystem. Jeder Fehler stellt ein Sicherheitsrisiko dar. Sämtlicher Code mit entsprechenden Berechtigungen, der auf Ihren Code zugreift, muss durch die folgenden Vorgänge zusätzliche Sicherheit implementieren:
Der Zugriff des aufrufenden Codes auf die Klasse bzw. Assembly muss beschränkt werden.
Für den aufrufenden Code müssen dieselben Sicherheitsüberprüfungen wie für den aufgerufenen Code durchgeführt werden (dies gilt auch für seine Aufrufer). Wenn Sie beispielsweise Code für den Aufruf einer Methode schreiben, die durch LinkDemand für SecurityPermission mit dem angegebenen UnmanagedCode-Flag geschützt ist, muss die Methode für diese Berechtigung außerdem LinkDemand ausführen (mindestens jedoch Demand). Eine Ausnahme liegt vor, wenn der Code die durch LinkDemand geschützte Methode in einer eingeschränkten Weise verwendet, die als sicher angesehen werden kann, da im Code andere Schutzmechanismen (z. B. Anforderungen) vorhanden sind. In diesem Ausnahmefall übernimmt der Aufrufer die Verantwortung für die Herabsetzung der Sicherheit des zugrunde liegenden Codes.
Es muss gewährleistet sein, dass ein Aufrufer den Codes nicht dahin gehend täuschen kann, dass dieser von sich aus geschützten Code aufruft. Der Aufrufer darf also nicht erzwingen, dass Code mit den entsprechenden Berechtigungen bestimmte Parameter an den geschützten Code übergibt oder Ergebnisse von diesem zurückgibt.
Schnittstellen und Verknüpfungsaufrufe
Wenn eine virtuelle Methode, eine virtuelle Eigenschaft oder ein virtuelles Ereignis mithilfe von LinkDemand eine Basisklassenmethode überschreibt, muss die Basisklassenmethode dieselbe LinkDemand aufweisen, damit die überschriebene Methode effizient ist. Bösartiger Code kann eine Umwandlung in den Basistyp vornehmen und die Basisklassenmethode aufrufen. Beachten Sie außerdem, dass Verknüpfungsaufrufe implizit Assemblys hinzugefügt werden können, die das AllowPartiallyTrustedCallersAttribute-Attribut auf der Assemblyebene nicht aufweisen.
Es empfiehlt sich, Methodenimplementierungen mit Verknüpfungsaufrufen zu schützen, wenn Schnittstellenmethoden ebenfalls Verknüpfungsaufrufe aufweisen. Beachten Sie bei der Verwendung von Verknüpfungsaufrufen mit Schnittstellen Folgendes:
Das AllowPartiallyTrustedCallersAttribute-Attribut wird auch auf Schnittstellen angewendet.
Sie können Verknüpfungsaufrufe auf Schnittstellen anwenden, um bestimmte Schnittstellen selektiv vor der Verwendung durch teilweise vertrauenswürdigen Code zu schützen, beispielsweise bei der Verwendung des AllowPartiallyTrustedCallersAttribute-Attributs.
Wenn eine Schnittstelle in einer Assembly definiert wurde, die nicht das AllowPartiallyTrustedCallersAttribute-Attribut enthält, können Sie die betreffende Schnittstelle für eine teilweise vertrauenswürdige Klasse implementieren.
Wenn Sie LinkDemand auf eine öffentliche Methode einer Klasse anwenden, die eine Schnittstellenmethode implementiert, wird LinkDemand nicht erzwungen, wenn anschließend in die Schnittstelle umgewandelt und die Methode aufgerufen wird. In diesem Fall wird aufgrund der Verknüpfung mit der Schnittstelle nur LinkDemand für die Schnittstelle berücksichtigt.
Überprüfen Sie die folgenden Elemente auf Sicherheitsprobleme:
Explizite Verknüpfungsaufrufe für Schnittstellenmethoden. Stellen Sie sicher, dass diese Verknüpfungsaufrufe den erwarteten Schutz bieten. Stellen Sie fest, ob bösartiger Code die Verknüpfungsaufrufe mithilfe einer Umwandlung wie oben beschrieben umgehen kann.
Virtuelle Methoden mit angewendeten Verknüpfungsaufrufen.
Typen und die von ihnen implementierten Schnittstellen. Diese sollten Verknüpfungsaufrufe einheitlich verwenden.