Freigeben über


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

CodeAccessPermission.Assert

CodeAccessPermission.Deny

IStackWalk.PermitOnly

Konzepte

Richtlinien für das Schreiben von sicherem Code

Überschreiben von Sicherheitsüberprüfungen

Verwenden der PermitOnly-Methode