CA2116: APTCA-Methoden sollten nur APTCA-Methoden aufrufen
TypeName |
AptcaMethodsShouldOnlyCallAptcaMethods |
CheckId |
CA2116 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Eine Methode in einer Assembly mit dem System.Security.AllowPartiallyTrustedCallersAttribute-Attribut ruft eine Methode in einer Assembly auf, die nicht über das Attribut verfügt.
Regelbeschreibung
Standardmäßig sind öffentliche oder geschützte Methoden in Assemblys mit starken Namen implizit durch Verknüpfungsaufrufe geschützt, sodass sie voll vertrauenswürdig sind. Nur voll vertrauenswürdige Aufrufer können auf eine Assembly mit starkem Namen zugreifen. Mit dem AllowPartiallyTrustedCallersAttribute- (APTCA-)Attribut markierte Assemblys mit starkem Namen verfügen nicht über diesen Schutz. Das Attribut deaktiviert den Linkaufruf, sodass nicht voll vertrauenswürdige Aufrufer auf die Assembly zugreifen können, beispielsweise Code, der in einem Intranet oder im 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 die beiden Methoden M1 und M2 die folgenden Bedingungen erfüllen, können böswillige Aufrufer mithilfe der M1-Methode den impliziten voll vertrauenswürdigen Linkaufruf umgehen, durch den M2 geschützt wird.
M1 ist eine öffentliche Methode. Sie wird in einer voll vertrauenswürdigen Assembly deklariert, die über das APTCA-Attribut verfügt.
M1 ruft die M2-Methode außerhalb der Assembly von M1 auf.
Die Assembly von M2 verfügt nicht über das APTCA-Attribut und sollte daher nicht durch oder für teilweise vertrauenswürdige Aufrufer ausgeführt werden.
Ein teilweise vertrauenswürdiger Aufrufer X kann die M1-Methode aufrufen und damit bewirken, dass M2 von M1 aufgerufen wird. Da M2 nicht über das APTCA-Attribut verfügt, muss der unmittelbare Aufrufer (M1) einen Linkaufruf erfüllen, um voll vertrauenswürdig zu sein. M1 ist voll vertrauenswürdig und erfüllt daher diese Bedingung. Das Sicherheitsrisiko entsteht dadurch, dass X nicht an der Erfüllung des Linkaufrufs beteiligt ist, durch den M2 gegenüber nicht vertrauenswürdigen Aufrufern geschützt wird. Deshalb 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 benötigt wird, verwenden Sie eine Anforderung, um die Methode zu schützen, die die voll vertrauenswürdige Assembly aufruft. Je nachdem, welche Funktionen durch die Methode zur Verfügung gestellt werden, erhalten Sie unterschiedliche Berechtigungen. Schützen Sie die Methode nach Möglichkeit mit einer Forderung nach voller Vertrauenswürdigkeit, um sicherzustellen, dass die zugrunde liegenden Funktionen nicht teilweise vertrauenswürdigen Aufrufern zur Verfügung gestellt werden. Wenn dies nicht möglich ist, wählen Sie einen Satz von Berechtigungen aus, durch den die zur Verfügung gestellten Funktionen wirksam geschützt werden. Weitere Informationen zu Anforderungen finden Sie unter Forderungen.
Wann sollten Warnungen unterdrückt werden?
Um eine Warnung dieser Regel gefahrlos unterdrücken zu können, müssen Sie sicherstellen, dass die durch die Methode zur Verfügung gestellten Funktionen Aufrufern keinen direkten oder indirekten Zugriff auf vertrauliche Informationen, Vorgänge oder Ressourcen gewähren, die auf destruktive Weise verwendet werden können.
Beispiel
Im folgenden Beispiel wird anhand von zwei Assemblys und einer Testanwendung die Sicherheitslücke veranschaulicht, die durch diese Regel erkannt wurde. Die erste Assembly weist das APTCA-Attribut nicht auf und sollte teilweise vertrauenswürdigen Aufrufern nicht zugänglich sein (in den obigen Erläuterungen 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.");
}
}
}
Die zweite Assembly ist voll vertrauenswürdig und lässt teilweise vertrauenswürdige Aufrufer zu (in den obigen Erläuterungen 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();
}
}
}
Die Testanwendung (in den obigen Erläuterungen dargestellt durch X) 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();
}
}
}
Folgende Ergebnisse werden zurückgegeben:
Verwandte Regeln
CA2117: APTCA-Typen sollten nur APTCA-Basistypen erweitern
Siehe auch
Konzepte
Richtlinien für das Schreiben von sicherem Code
Durch teilweise vertauenswürdigen Code aufrufbare .NET Framework-Assemblys
Verwenden von Bibliotheken aus teilweise vertrauenswürdigem Code