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 eineM2
-Methode außerhalb der Assembly vonM1
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 M1
aufrufen, was dazu führt, dass M1
M2
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.
Ähnliche Regeln
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für