Freigeben über


CA2116: APTCA-Methoden sollten nur APTCA-Methoden aufrufen.

Element Wert
RuleId CA2116
Category Microsoft.Security
Unterbrechende Änderung Breaking

Ursache

Eine Methode in einer Assembly mit dem Attribut System.Security.AllowPartiallyTrustedCallersAttribute ruft eine Methode in einer Assembly auf, die nicht über das Attribut verfügt.

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

Regelbeschreibung

Standardmäßig werden öffentliche oder geschützte Methoden in Assemblys mit starken Namen implizit durch Linkaufrufe für volle Vertrauenswürdigkeit geschützt. Nur voll vertrauenswürdige Aufrufer können auf eine Assembly mit starkem Namen zugreifen. Assemblys mit starken Namen, die mit dem AllowPartiallyTrustedCallersAttribute-Attribut (APTCA) gekennzeichnet sind, verfügen nicht über diesen Schutz. Das Attribut deaktiviert den Linkaufruf und macht die Assembly für Aufrufer zugänglich, die nicht voll vertrauenswürdig sind, z. B. Code, der über ein Intranet oder über das Internet ausgeführt wird.

Wenn eine voll vertrauenswürdige Assembly über das APTCA-Attribut verfügt und die Assembly Code in einer anderen Assembly ausführt, die keine teilweise vertrauenswürdigen Aufrufer zulässt, kann diese Sicherheitslücke ausgenutzt werden. Wenn zwei Methoden (M1 und M2) die folgenden Bedingungen erfüllen, können böswillige Aufrufer die Methode M1 verwenden, um die implizite Anforderung an den Linkaufruf für volle Vertrauenswürdigkeit zu umgehen, der M2 schützt:

  • M1 ist eine öffentliche Methode, die in einer voll vertrauenswürdigen Assembly deklariert ist, die das APTCA-Attribut aufweist.

  • M1 ruft eine M2-Methode außerhalb der Assembly von M1 auf.

  • Die Assembly von M2 weist kein APTCA-Attribut auf und sollte daher nicht von oder im Auftrag von Aufrufern ausgeführt werden, die teilweise vertrauenswürdig sind.

Ein teilweise vertrauenswürdiger Aufrufer X kann die Methode M1aufrufen, was dazu führt, dass M1M2 aufruft. Da M2 das APTCA-Attribut nicht besitzt, muss der unmittelbare Aufrufer (M1) einen Linkaufruf für volle Vertrauenswürdigkeit erfüllen; M1 hat voll Vertrauenswürdigkeit und erfüllt daher diese Prüfung. Es liegt ein Sicherheitsrisiko vor, da X nicht dazu beiträgt, dass der Linkaufruf erfüllt wird, der M2 vor nicht vertrauenswürdigen Aufrufern schützt. Daher dürfen Methoden mit dem APTCA-Attribut keine Methoden aufrufen, die nicht über das Attribut verfügen.

Behandeln von Verstößen

Wenn das APTCA-Attribut erforderlich ist, verwenden Sie eine Anforderung, um die Methode zu schützen, die in die voll vertrauenswürdige Assembly aufruft. Die genauen Berechtigungen, die Sie benötigen, sind von der Funktionalität abhängig, die von Ihrer Methode verfügbar gemacht wird. Schützen Sie wenn möglich die Methode mit einer Anforderung für volle Vertrauenswürdigkeit, um sicherzustellen, dass die zugrunde liegende Funktionalität teilweise vertrauenswürdigen Aufrufern nicht verfügbar gemacht wird. Wenn dies nicht möglich ist, wählen Sie Berechtigungen aus, die die verfügbar gemachte Funktionalität effektiv schützen.

Wann sollten Warnungen unterdrückt werden?

Um eine Warnung durch diese Regel sicher unterdrücken zu können, müssen Sie sicherstellen, dass die Funktionalität, die durch Ihren Methode verfügbar gemacht wird, Aufrufern weder direkt noch indirekt Zugriff auf sensible Informationen, Vorgänge oder Ressourcen ermöglichen darf, die auf destruktive Weise verwendet werden können.

Beispiel 1

Das folgende Beispiel verwendet zwei Assemblys und eine Testanwendung, um das mit dieser Regel erkannte Sicherheitsrisiko zu veranschaulichen. Die erste Assembly verfügt nicht über das APTCA-Attribut und sollte nicht für teilweise vertrauenswürdige Aufrufer erreichbar sein (in der vorangegangenen Diskussion dargestellt durch M2).

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This code is compiled into a strong-named
// assembly that requires full trust and does 
// not allow partially trusted callers. 

namespace AptcaTestLibrary
{
   public class ClassRequiringFullTrust
   {
      public static void DoWork()
      {
        Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
      }
   }
}

Beispiel 2

Die zweite Assembly ist vollständig vertrauenswürdig und lässt teilweise vertrauenswürdige Aufrufer zu (in der vorangegangenen Diskussion dargestellt durch M1).

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This assembly executes with full trust and 
// allows partially trusted callers. 

[assembly:AllowPartiallyTrustedCallers]  

namespace AptcaTestLibrary
{
   public class AccessAClassRequiringFullTrust
   {
      public static void Access()
      {    
         // This security check fails if the caller 
         // does not have full trust. 
         NamedPermissionSet pset= new NamedPermissionSet("FullTrust");

         // This try-catch block shows the caller's permissions.
         // Correct code would either not catch the exception,
         // or would rethrow it.
         try 
         {
            pset.Demand();
         }
         catch (SecurityException e)
         {
            Console.WriteLine("Demand for full trust:{0}", e.Message);
         }
         // Call the type that requires full trust.
         // Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
         ClassRequiringFullTrust.DoWork();
     }
   }
}

Beispiel 3

Die Testanwendung (dargestellt durch X in der vorangegangenen Diskussion) ist teilweise vertrauenswürdig.

using System;
using AptcaTestLibrary;

// If this test is run from the local computer, it gets full trust by default.
// Remove full trust.
[assembly:System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, Name="FullTrust")]

namespace TestSecLibrary
{
   class TestApctaMethodRule
   {
      public static void Main()
      {
          // Indirectly calls DoWork in the full-trust class.
          ClassRequiringFullTrust testClass = new ClassRequiringFullTrust();
          testClass.Access();
      }
   }
}

Dieses Beispiel erzeugt die folgende Ausgabe:

Demand for full trust:Request failed.
ClassRequiringFullTrust.DoWork was called.

Weitere Informationen