CA2108: Deklarative Sicherheit auf Werttypen überprüfen
TypeName |
ReviewDeclarativeSecurityOnValueTypes |
CheckId |
CA2108 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein öffentlicher oder geschützter Werttyp wird durch Datenzugriff und Modellierung oder Verknüpfungsaufrufe geschützt.
Regelbeschreibung
Werttypen werden durch ihre Standardkonstruktoren zugeordnet und initialisiert, bevor andere Konstruktoren ausgeführt werden. Wenn der Werttyp durch Demand oder LinkDemand geschützt wird und der Aufrufer nicht über die erforderlichen Berechtigungen verfügt, um die Sicherheitsüberprüfung zu bestehen, dann kann kein anderer Konstruktor als der Standardkonstruktor ausgeführt werden, und es wird eine Sicherheitsausnahme ausgelöst. Der Werttyp wird nicht freigegeben. Er wird in dem Zustand belassen, der durch seinen Standardkonstruktor festgelegt wurde. Es darf nicht davon ausgegangen werden, dass ein Aufrufer, der eine Instanz der Werttyps übergibt, dazu berechtigt ist, die Instanz zu erstellen oder darauf zuzugreifen.
Behandeln von Verstößen
Sie können einen Verstoß gegen diese Regel nur dann beheben, wenn Sie die Sicherheitsüberprüfung aus dem Typ entfernen und stattdessen Sicherheitsüberprüfungen auf Methodenebene ausführen. Beachten Sie, dass mit dieser Art der Behebung eines Regelverstoßes Aufrufer mit unzureichenden Berechtigungen nicht daran gehindert werden, Instanzen des Werttyps abzurufen. Sie müssen sicherstellen, dass eine Instanz des Werttyps im Standardzustand keine sicherheitsrelevanten Daten verfügbar macht und nicht auf schädliche Weise verwendet werden kann.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann unterdrückt werden, wenn jeder Aufrufer Instanzen des Werttyps in dessen Standardzustand abrufen kann, ohne die Sicherheit zu gefährden.
Beispiel
Im folgenden Beispiel wird eine Bibliothek veranschaulicht, die einen Werttyp enthält, der gegen diese Regel verstößt. Beachten Sie, dass beim StructureManager-Typ davon ausgegangen wird, dass ein Aufrufer, der eine Instanz der Werttyps übergibt, dazu berechtigt ist, die Instanz zu erstellen oder darauf zuzugreifen.
using System;
using System.Security;
using System.Security.Permissions;
[assembly:AllowPartiallyTrustedCallers]
namespace SecurityRulesLibrary
{
// Violates rule: ReviewDeclarativeSecurityOnValueTypes.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public struct SecuredTypeStructure
{
internal double xValue;
internal double yValue;
public SecuredTypeStructure(double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine("Creating an instance of SecuredTypeStructure.");
}
public override string ToString()
{
return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
}
}
public class StructureManager
{
// This method asserts trust, incorrectly assuming that the caller must have
// permission because they passed in instance of the value type.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]
public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
{
aStructure.xValue += 100;
aStructure.yValue += 100;
Console.WriteLine ("New values {0}", aStructure.ToString());
return aStructure;
}
}
}
Die folgende Anwendung veranschaulicht die Schwäche der Bibliothek.
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name="FullTrust")]
namespace TestSecurityExamples
{
public class TestDemandOnValueType
{
static SecuredTypeStructure mystruct;
[STAThread]
public static void Main()
{
try
{
mystruct = new SecuredTypeStructure(10,10);
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure custom constructor: {0}", e.Message);
}
// The call to the default constructor
// does not throw an exception.
try
{
mystruct = StructureManager.AddStepValue(
new SecuredTypeStructure());
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure default constructor: {0}", e.Message);
}
try
{
StructureManager.AddStepValue(mystruct);
}
catch (Exception e)
{
Console.WriteLine(
"StructureManager add step: {0}", e.Message);
}
}
}
}
Folgende Ergebnisse werden zurückgegeben: