CA2147: Transparente Methoden dürfen keine Sicherheitsassertionen verwenden
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2147 |
Kategorie (Category) |
Microsoft.Security |
Unterbrechende Änderung |
Breaking |
Ursache
Code, der als SecurityTransparentAttribute markiert wurde, verfügt nicht über ausreichende Berechtigungen für die Verwendung von Assertionen.
Regelbeschreibung
Durch diese Regel werden alle Methoden und Typen in einer Assembly analysiert, die entweder zu 100 % aus transparentem Code oder aus einer Kombination aus transparentem/relevantem Code besteht. Anschließend werden alle deklarativen oder imperativen Verwendungen von Assert gekennzeichnet.
Zur Laufzeit bewirken alle Aufrufe von Assert von transparentem Code aus, dass eine InvalidOperationException ausgelöst wird.Dies kann sowohl bei 100 % transparenten als auch bei Assemblys mit kombiniertem transparentem/relevantem Code auftreten, in denen eine Methode oder ein Typ zwar transparent deklariert ist, jedoch eine deklarative oder imperative Assertion enthält.
In .NET Framework 2.0 wurde ein Feature mit dem Namen Transparenz eingeführt.Einzelne Methoden, Felder, Schnittstellen, Klassen und Typen können entweder sicherheitstransparent oder sicherheitsrelevant sein.
In transparentem Code können Sicherheitsberechtigungen nicht ausgeweitet werden.Daher werden alle durch Code gewährten oder angeforderten Berechtigungen automatisch durch den Code an den Aufrufer oder die Hostanwendungsdomäne weitergeleitet.Beispiele für Rechteerweiterungen sind Assertionen, LinkDemands, SuppressUnmanagedCode und unsafe-Code.
Behandeln von Verstößen
Um das Problem zu beheben, markieren Sie entweder den Code, durch den die Assertion aufgerufen wird, mit SecurityCriticalAttribute, oder entfernen die Assertion.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Meldung dieser Regel.
Beispiel
Dieser Code verursacht einen Fehler, wenn SecurityTestClass transparent ist, während die Assert-Methode eine InvalidOperationException auslöst.
using System;
using System.Security;
using System.Security.Permissions;
namespace TransparencyWarningsDemo
{
public class TransparentMethodsUseSecurityAssertsClass
{
// CA2147 violation - transparent code using a security assert declaratively. This can be fixed by
// any of:
// 1. Make DeclarativeAssert critical
// 2. Make DeclarativeAssert safe critical
// 3. Remove the assert attribute
[PermissionSet(SecurityAction.Assert, Unrestricted = true)]
public void DeclarativeAssert()
{
}
public void ImperativeAssert()
{
// CA2147 violation - transparent code using a security assert imperatively. This can be fixed by
// any of:
// 1. Make ImperativeAssert critical
// 2. Make ImperativeAssert safe critical
// 3. Remove the assert call
new PermissionSet(PermissionState.Unrestricted).Assert();
}
}
}
Eine Option ist, den Code der SecurityTransparentMethod-Methode im Beispiel unten zu überprüfen, und wenn die Methode sicher für die Erhöhung ist, SecurityTransparentMethod als sicherheitskritisch zu kennzeichnen. Dies erfordert, dass eine ausführliche, vollständige und fehlerfreie Sicherheitsüberprüfung auf die Methode angewendet wird, zusammen mit allen Aufrufen, die innerhalb der Methode unter der Assertion auftreten:
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
[System.Security.SecurityCritical]
void SecurityCriticalMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Eine weitere Möglichkeit besteht darin, die Assertion aus dem Code zu entfernen und nachfolgende Datei-E/A-Berechtigungsanforderungen über SecurityTransparentMethod hinaus an den Aufrufer weiterleiten zu lassen.Dies ermöglicht Sicherheitsüberprüfungen.In diesem Fall ist generell keine Sicherheitsüberprüfung erforderlich, da die Berechtigungsanforderungen zum Aufrufer und/oder zur Anwendungsdomäne geleitet werden.Berechtigungsforderungen unterliegen einer strengen Kontrolle durch Sicherheitsrichtlinien, die Hostumgebung und gewährte Berechtigungen für die Codequelle.