CA2122: Methoden mit Linkaufrufen nicht indirekt verfügbar machen
TypeName |
DoNotIndirectlyExposeMethodsWithLinkDemands |
CheckId |
CA2122 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein öffentlicher oder geschützter Member enthält Verknüpfungsaufrufe und wird von einem Member aufgerufen, der keine Sicherheitsüberprüfungen ausführt.
Regelbeschreibung
Ein Linkaufruf überprüft nur die Berechtigungen des unmittelbaren Aufrufers. Wenn ein Member X keine Sicherheitsanforderungen an seine Aufrufer stellt und Code aufruft, der durch einen Linkaufruf geschützt ist, kann ein Aufrufer ohne die notwendige Berechtigung X für den Zugriff auf den geschützten Member verwenden.
Behandeln von Verstößen
Fügen Sie dem Member gesicherten Datenzugriff und Modellierung oder einen Linkaufruf hinzu, damit er auf den durch einen Linkaufruf geschützten Member keinen ungesicherten Zugriff mehr ermöglicht.
Wann sollten Warnungen unterdrückt werden?
Um eine Warnung dieser Regel gefahrlos unterdrücken zu können, müssen Sie sicherstellen, dass der Code seinen Aufrufern keinen Zugriff auf Vorgänge oder Ressourcen gewährt, die auf destruktive Weise verwendet werden können.
Beispiel
In den folgenden Beispielen wird eine Bibliothek dargestellt, die gegen die Regel verstößt, sowie eine Anwendung, die die Schwachpunkte der Bibliothek aufzeigt. Die Beispielbibliothek stellt zwei Methoden bereit, die zusammen gegen die Regel verstoßen. Die EnvironmentSetting-Methode wird durch einen Linkaufruf nach uneingeschränktem Zugriff auf Umgebungsvariablen gesichert. Die DomainInformation-Methode stellt keine Sicherheitsanforderungen an ihre Aufrufer, bevor EnvironmentSetting aufgerufen wird.
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
public class DoNotIndirectlyExposeMethodsWithLinkDemands
{
// Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
public static string DomainInformation()
{
return EnvironmentSetting("USERDNSDOMAIN");
}
// Library method with link demand.
// This method holds its immediate callers responsible for securing the information.
// Because a caller must have unrestricted permission, the method asserts read permission
// in case some caller in the stack does not have this permission.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public static string EnvironmentSetting(string environmentVariable)
{
EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
envPermission.Assert();
return Environment.GetEnvironmentVariable(environmentVariable);
}
}
}
Die folgende Anwendung ruft den ungesicherten Bibliotheksmember auf.
using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;
// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
class TestUnsecured
{
[STAThread]
static void Main(string[] args)
{
string value = null;
try
{
value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
}
catch (SecurityException e)
{
Console.WriteLine(
"Call to unsecured member was stopped by code access security! {0}",
e.Message);
throw;
}
if (value != null)
{
Console.WriteLine("Value from unsecured member: {0}", value);
}
}
}
}
Folgende Ergebnisse werden zurückgegeben:
Siehe auch
Konzepte
Richtlinien für das Schreiben von sicherem Code