CA2114: Methodensicherheit sollte Superset des Typs sein
TypeName |
MethodSecurityShouldBeASupersetOfType |
CheckId |
CA2114 |
Kategorie (Category) |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Ein Typ weist deklarative Sicherheit auf, wie auch eine seiner Methoden für die gleiche Sicherheitsaktion. Bei der Sicherheitsaktion handelt es sich nicht um Verknüpfungsaufrufe oder Vererbungsforderungen, und die vom Typ überprüften Berechtigungen sind keine Teilmenge der Berechtigungen, die durch die Methode überprüft werden.
Regelbeschreibung
Eine Methode sollte bei der gleichen Aktion nicht sowohl auf Methodenebene als auch auf Typebene deklarative Sicherheit aufweisen.Die beiden Überprüfungen werden nicht kombiniert; nur die Anforderung auf Methodenebene wird angewendet.Wenn ein Typ z. B. die Berechtigung X und eine seiner Methoden die Berechtigung Y anfordert, benötigt der Code die Berechtigung X nicht, um die Methode auszuführen.
Behandeln von Verstößen
Überprüfen Sie den Code, um sicherzustellen, dass beide Aktionen erforderlich sind.Wenn beide Aktionen erforderlich sind, stellen Sie sicher, dass die Aktion auf Methodenebene die auf Typebene festgelegte Sicherheit umfasst.Wenn der Typ z. B. die Berechtigung X anfordert und seine Methode auch die Berechtigung Y anfordern muss, sollte die Methode X und Y explizit anfordern.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn für die Methode nicht die durch den Typ festgelegte Sicherheit benötigt wird.Ein solches Szenario ist jedoch nicht der Normalfall und sollte Anlass sein, den Entwurf sorgfältig zu überprüfen.
Beispiel
Im folgenden Beispiel werden Umgebungsberechtigungen verwendet, um die Gefahren bei einem Verstoß gegen diese Regel zu veranschaulichen.In diesem Beispiel erstellt der Anwendungscode eine Instanz des gesicherten Typs, bevor die durch den Typ verlangte Berechtigung verweigert wird.In einem echten Bedrohungsszenario müsste die Anwendung eine Instanz des Objekts auf andere Weise erhalten.
Im folgenden Beispiel fordert die Bibliothek die Schreibberechtigung für einen Typ und die Leseberechtigung für eine Methode an.
using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace SecurityRulesLibrary
{
[EnvironmentPermissionAttribute(SecurityAction.Demand, Write="PersonalInfo")]
public class MyClassWithTypeSecurity
{
[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
[return:MarshalAs(UnmanagedType.Bool)]
public static extern bool SetEnvironmentVariable(
string lpName,
string lpValue);
// Constructor.
public MyClassWithTypeSecurity(int year, int month, int day)
{
DateTime birthday = new DateTime(year, month, day);
// Write out PersonalInfo environment variable.
SetEnvironmentVariable("PersonalInfo",birthday.ToString());
}
[EnvironmentPermissionAttribute(SecurityAction.Demand, Read="PersonalInfo")]
public string PersonalInformation ()
{
// Read the variable.
return Environment.GetEnvironmentVariable("PersonalInfo");
}
}
}
Der folgende Anwendungscode veranschaulicht die Anfälligkeit der Bibliothek, da die Methode aufgerufen wird, obwohl sie die Sicherheitsanforderung auf Typebene nicht erfüllt.
using System;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
namespace TestSecRulesLibrary
{
public class TestMethodLevelSecurity
{
MyClassWithTypeSecurity dataHolder;
void RetrievePersonalInformation(string description)
{
try
{
Console.WriteLine(
"{0} Personal information: {1}",
description, dataHolder.PersonalInformation());
}
catch (SecurityException e)
{
Console.WriteLine(
"{0} Could not access personal information: {1}",
description, e.Message);
}
}
[STAThread]
public static void Main()
{
TestMethodLevelSecurity me = new TestMethodLevelSecurity();
me.dataHolder = new MyClassWithTypeSecurity(1964,06,16);
// Local computer zone starts with all environment permissions.
me.RetrievePersonalInformation("[All permissions]");
// Deny the write permission required by the type.
EnvironmentPermission epw = new EnvironmentPermission(
EnvironmentPermissionAccess.Write,"PersonalInfo");
epw.Deny();
// Even though the type requires write permission,
// and you do not have it; you can get the data.
me.RetrievePersonalInformation(
"[No write permission (demanded by type)]");
// Reset the permissions and try to get
// data without read permission.
CodeAccessPermission.RevertAll();
// Deny the read permission required by the method.
EnvironmentPermission epr = new EnvironmentPermission(
EnvironmentPermissionAccess.Read,"PersonalInfo");
epr.Deny();
// The method requires read permission, and you
// do not have it; you cannot get the data.
me.RetrievePersonalInformation(
"[No read permission (demanded by method)]");
}
}
}
Folgende Ergebnisse werden zurückgegeben: