CA2107: Verwendung von Deny und PermitOnly überprüfen
TypeName |
ReviewDenyAndPermitOnlyUsage |
CheckId |
CA2107 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Eine Methode enthält eine Sicherheitsüberprüfung, welche die PermitOnly-Sicherheitsaktion oder die Deny-Sicherheitsaktion angibt.
Regelbeschreibung
Die Verwenden der PermitOnly-Methode-Sicherheitsaktion und die CodeAccessPermission.Deny-Sicherheitsaktion sollten nur von Entwicklern mit sehr guten Kenntnissen der .NET Framework-Sicherheit verwendet werden. Code, in dem diese Sicherheitsaktionen verwendet werden, sollte einer Sicherheitsüberprüfung unterzogen werden.
Deny ändert das Standardverhalten des Stackwalks, der als Reaktion auf eine Sicherheitsanforderung auftritt. Es ermöglicht Ihnen die Angabe von Berechtigungen, die unabhängig von den tatsächlichen Berechtigungen der Aufrufer in der Aufrufliste während der Dauer der Deny-Methode nicht gewährt werden dürfen. Wenn der Stackwalk eine durch Deny gesicherte Methode erkennt und die angeforderte Berechtigung in den verweigerten Berechtigungen enthalten ist, erzeugt der Stackwalk einen Fehler. PermitOnly ändert ebenfalls das Standardverhalten des Stackwalks. Durch diese Methode ist es möglich, im Code nur die Berechtigungen anzugeben, die gewährt werden können, wobei die Berechtigungen der Aufrufer nicht berücksichtigt werden. Wenn der Stackwalk eine durch PermitOnly gesicherte Methode erkennt und die angeforderte Berechtigung nicht in den Berechtigungen enthalten ist, die mit PermitOnly angegeben werden, erzeugt der Stackwalk einen Fehler.
Code, der auf diesen Aktionen beruht, sollte wegen der begrenzten Einsatzmöglichkeiten und des komplizierten Verhaltens dieser Aktionen sorgfältig auf Sicherheitslücken überprüft werden. Berücksichtigen Sie die folgenden Punkte:
Verknüpfungsaufrufe werden durch Deny oder PermitOnly nicht beeinflusst.
Wenn Deny oder PermitOnly in dem gleichen Stapelrahmen auftreten wie die Anforderung, die den Stackwalk auslöst, sind die Sicherheitsaktionen wirkungslos.
Bei Werten, die zur Erstellung pfadbasierter Berechtigungen verwendet werden, gibt es in der Regel verschiedene Angabemöglichkeiten. Durch die Verweigerung des Zugriffs auf eine Form des Pfads wird nicht der Zugriff auf alle Formen verweigert. Wenn die Dateifreigabe \\Server\Freigabe z. B. dem Netzlaufwerk X: zugeordnet ist, müssen Sie den Zugriff auf \\Server\Freigabe\Datei, X:\Datei und alle übrigen Pfade verweigern, über die auf die Datei zugegriffen wird, um den Zugriff auf eine Datei der Freigabe zu verweigern.
Ein CodeAccessPermission.Assert kann einen Stackwalk beenden, bevor Deny oder PermitOnly erreicht wird.
Wenn Deny eine Wirkung hat, beispielsweise wenn ein Aufrufer eine durch Deny blockierte Berechtigung besitzt, kann der Aufrufer unter Umgehung von Deny direkt auf die geschützte Ressource zugreifen. Wenn der Aufrufer die verweigerte Berechtigung nicht besitzt, würde der Stackwalk ohne Deny dementsprechend fehlschlagen.
Behandeln von Verstößen
Jede Verwendung dieser Sicherheitsaktionen verursacht einen Verstoß. Um einen Verstoß zu beheben, verwenden Sie diese Sicherheitsaktionen nicht.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie eine Warnung dieser Regel erst nach einer Sicherheitsüberprüfung.
Beispiel
Im folgenden Beispiel werden einige Einschränkungen von Deny veranschaulicht.
Die folgende Bibliothek enthält eine Klasse mit zwei Methoden, die bis auf die Sicherheitsanforderungen, die sie schützen, identisch sind.
using System.Security;
using System.Security.Permissions;
using System;
namespace SecurityRulesLibrary
{
public class SomeSecuredMethods
{
// Demand immediate caller has suitable permission
// before revealing sensitive data.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByLinkDemand()
{
Console.Write("LinkDemand: ");
}
[EnvironmentPermissionAttribute(SecurityAction.Demand,
Read="COMPUTERNAME;USERNAME;USERDOMAIN")]
public static void MethodProtectedByDemand()
{
Console.Write("Demand: ");
}
}
}
Die folgende Anwendung veranschaulicht die Wirkungen von Deny auf die gesicherten Methoden der Bibliothek.
using System.Security;
using System.Security.Permissions;
using System;
using SecurityRulesLibrary;
namespace TestSecurityLibrary
{
// Violates rule: ReviewDenyAndPermitOnlyUsage.
public class TestPermitAndDeny
{
public static void TestAssertAndDeny()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Assert();
try
{
SomeSecuredMethods.MethodProtectedByDemand();
Console.WriteLine(
"Caller's Deny has no effect on Demand " +
"with the asserted permission.");
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect on LinkDemand " +
"with the asserted permission.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}", e);
}
}
public static void TestDenyAndLinkDemand()
{
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"Caller's Deny has no effect with " +
"LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine(
"Caller's Deny protected the library.{0}",e);
}
}
public static void Main()
{
EnvironmentPermission envPermission = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,
"COMPUTERNAME;USERNAME;USERDOMAIN");
envPermission.Deny();
//Test Deny and Assert interaction for LinkDemands and Demands.
TestAssertAndDeny();
//Test Deny's effects on code in different stack frame.
TestDenyAndLinkDemand();
//Test Deny's effect on code in same frame as deny.
try
{
SomeSecuredMethods.MethodProtectedByLinkDemand();
Console.WriteLine(
"This Deny has no effect with LinkDemand-protected code.");
}
catch (SecurityException e)
{
Console.WriteLine("This Deny protected the library.{0}",e);
}
}
}
}
Folgende Ergebnisse werden zurückgegeben:
Siehe auch
Referenz
CodeAccessPermission.PermitOnly
Konzepte
Richtlinien für das Schreiben von sicherem Code