Freigeben über


Überprüfen der SuppressUnmanagedCodeSecurityAttribute-Verwendung

Aktualisiert: November 2007

     TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Kategorie

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Ein öffentlicher oder geschützter Typ bzw. Member verfügt über das System.Security.SuppressUnmanagedCodeSecurityAttribute-Attribut.

Regelbeschreibung

SuppressUnmanagedCodeSecurityAttribute ändert das Standardverhalten des Sicherheitssystems für Member, die nicht verwalteten Code mithilfe eines COM-Interop- oder Plattformaufrufs ausführen. Im Allgemeinen führt das System bei einer Berechtigung für nicht verwalteten Code einen Datenzugriff aus. Diese Anforderung erfolgt zur Laufzeit bei jedem Aufruf des Members, und jeder Aufrufer in der Aufrufliste wird auf die Berechtigung überprüft. Wenn das Attribut vorhanden ist, führt das System Verknüpfungsaufrufe für die Berechtigung aus: Die Berechtigungen des unmittelbaren Aufrufers werden überprüft, wenn der Aufrufer JIT-kompiliert ist.

Dieses Attribut wird hauptsächlich verwendet, um die Leistung zu erhöhen. Der Leistungszuwachs geht jedoch mit beträchtlichen Sicherheitsrisiken einher. Wenn Sie das Attribut öffentlichen Membern hinzufügen, die systemeigene Methoden aufrufen, benötigen die Aufrufer in der Aufrufliste (also nicht die unmittelbaren Aufrufer) keine Berechtigung für nicht verwalteten Code, um unverwalteten Code auszuführen. Je nach den Aktionen und der Eingabebehandlung des öffentlichen Members wird nicht vertrauenswürdigen Aufrufern unter Umständen der Zugriff auf Funktionen gestattet, die normalerweise nur für vertrauenswürdigen Code verfügbar sind.

.NET Framework verwendet Sicherheitsüberprüfungen, um Aufrufern direkten Zugriff auf den Adressbereich des aktuellen Prozesses zu verwehren. Da dieses Attribut die normalen Sicherheitsvorkehrungen umgeht, stellt Ihr Code eine schwerwiegende Bedrohung dar, wenn er zum Lesen oder Beschreiben des Speichers des Prozesses verwendet werden kann. Das Risiko ist nicht auf Methoden beschränkt, bei denen der Zugriff auf den Prozessspeicher gewollt ist, sondern in allen Szenarien vorhanden, in denen bösartiger Code Zugriff durch ein beliebiges Mittel erreichen kann, beispielsweise durch unerwartete, fehlerhafte oder ungültige Eingaben.

Die Standardsicherheitsrichtlinie gewährt einer Assembly nur dann eine Berechtigung für nicht verwalteten Code, wenn sie auf dem lokalen Computer ausgeführt wird oder einer der folgenden Gruppen angehört:

  • Codegruppe Arbeitsplatzzone

  • Codegruppe Starker Microsoft-Name

  • Codegruppe Starker ECMA-Name

Behandlung von Verstößen

Überprüfen Sie Ihren Code sorgfältig, um sicherzustellen, dass dieses Attribut absolut notwendig ist. Wenn Sie mit den Sicherheitsvorkehrungen für verwalteten Code nicht vertraut sind oder Ihnen die Auswirkungen der Verwendung dieses Attributs auf die Sicherheit nicht klar sind, entfernen Sie es aus dem Code. Wenn das Attribut erforderlich ist, müssen Sie sicherstellen, dass Aufrufer den Code nicht in böswilliger Absicht verwenden können. Wenn der Code über keine Berechtigung zur Ausführung von nicht verwaltetem Code verfügt, ist dieses Attribut wirkungslos und sollte entfernt werden.

Wann sollten Warnungen unterdrückt werden?

Um eine Warnung dieser Regel gefahrlos unterdrücken zu können, müssen Sie sicherstellen, dass der Code Aufrufern keinen Zugriff auf systemeigene Vorgänge oder Ressourcen gewährt, die auf destruktive Weise verwendet werden können.

Beispiel

Das folgende Beispiel verstößt gegen die Regel.

using System.Security;

// These two classes are identical
// except for the location of the attribute.

namespace SecurityRulesLibrary
{
    public class MyBadMemberClass
   {
      [SuppressUnmanagedCodeSecurityAttribute()]
      public void DoWork()
      {
         FormatHardDisk();
      }

      void FormatHardDisk()
      {
         // Code that calls unmanaged code.
      }
   }

   [SuppressUnmanagedCodeSecurityAttribute()]
   public class MyBadTypeClass
   {
      public void DoWork()
      {
         FormatHardDisk();
      }

      void FormatHardDisk()
      {
         // Code that calls unmanaged code.
      }
   }
}

Im folgenden Beispiel gibt die DoWork-Methode einen öffentlich zugänglichen Codepfad zur FormatHardDisk-Plattformaufrufmethode an.

using System.Security;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   public class SuppressIsOnPlatformInvoke
   {
      // The DoWork method is public and provides unsecured access
      // to the platform invoke method FormatHardDisk.
      [SuppressUnmanagedCodeSecurityAttribute()]
      [DllImport("native.dll")]

      private static extern void FormatHardDisk();
      public void DoWork()
      {
         FormatHardDisk();
      }
   }

   // Having the attribute on the type also violates the rule.
   [SuppressUnmanagedCodeSecurityAttribute()]
   public class SuppressIsOnType
   {
      [DllImport("native.dll")]

      private static extern void FormatHardDisk();
      public void DoWork()
      {
         FormatHardDisk();
      }
   }
}

Im folgenden Beispiel wird ein Verstoß durch die öffentliche DoDangerousThing-Methode verursacht. Um den Verstoß aufzulösen, sollte DoDangerousThing privat sein, und der Zugriff darauf sollte über eine öffentliche Methode erfolgen, die durch eine Sicherheitsanforderung gesichert ist, wie durch die DoWork-Methode veranschaulicht wird.

using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   [SuppressUnmanagedCodeSecurityAttribute()]
   public class BadTypeWithPublicPInvokeAndSuppress
   {
      [DllImport("native.dll")]

      public static extern void DoDangerousThing();
      public void DoWork()
      {
         // Note that because DoDangerousThing is public, this 
         // security check does not resolve the violation.
         // This only checks callers that go through DoWork().
         SecurityPermission secPerm = new SecurityPermission(
            SecurityPermissionFlag.ControlPolicy | 
            SecurityPermissionFlag.ControlEvidence
         );
         secPerm.Demand();
         DoDangerousThing();
      }
   }
}

Siehe auch

Konzepte

Sicherheitsoptimierungen

Verknüpfungsaufrufe

Referenz

System.Security.SuppressUnmanagedCodeSecurityAttribute

Weitere Ressourcen

Richtlinien für das Schreiben von sicherem Code

Datenzugriff