CA2147 : Les méthodes transparentes ne peuvent pas utiliser d’assertions de sécurité
Élément | Valeur |
---|---|
ID de la règle | CA2147 |
Category | Microsoft.Security |
Modification avec rupture | Rupture |
Cause
Aucune autorisation suffisante n’est accordée à un code marqué comme attribut SecurityTransparentAttribute pour procéder à une assertion.
Notes
Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.
Description de la règle
Cette règle analyse toutes les méthodes et tous les types dans un assembly qui est entièrement transparent ou mi-transparent et mi-critique, et elle signale toutes les utilisations déclaratives ou impératives de Assert.
Au moment de l’exécution, tous les appels à Assert partir du code transparent entraînent la levée de InvalidOperationException. Cela peut se produire dans les deux assemblys entièrement transparents, ainsi que dans des assemblys transparents/critiques mixtes où une méthode ou un type est déclaré transparent, mais inclut une assertion déclarative ou impérative.
.NET Framework 2.0 a introduit une fonctionnalité nommée transparence. Les méthodes, champs, interfaces, classes et types individuels peuvent être transparents ou critiques.
Le code transparent n’est pas autorisé à élever les privilèges de sécurité. Par conséquent, toutes les autorisations accordées ou demandées sont transmises automatiquement par le biais du code au domaine de l’appelant ou de l’application hôte. Parmi les exemples d’élévations, on trouve Asserts, LinkDemands, SuppressUnmanagedCode et du code unsafe
.
Comment corriger les violations
Pour résoudre le problème, marquez le code qui appelle l’assertion avec SecurityCriticalAttribute ou supprimez l’assertion.
Quand supprimer les avertissements
Ne supprimez pas un message de cette règle.
Exemple 1
Ce code échoue si SecurityTestClass
est transparent, lorsque la Assert
méthode lève un InvalidOperationException.
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();
}
}
}
Exemple 2
L’une des options consiste à passer en revue la méthode SecurityTransparentMethod dans l’exemple ci-dessous, et si la méthode est considérée comme sécurisée pour l’élévation, marquez SecurityTransparentMethod comme membre ou type critique de sécurité. Cela nécessite qu’un audit de sécurité détaillé, complet et sans erreur soit effectué sur la méthode avec tous les appels qui se produisent dans la méthode sous Assert :
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
}
}
}
Une autre option consiste à supprimer l’assertion du code et à laisser les demandes d’autorisation d’E/S de fichier ultérieures au-delà de SecurityTransparentMethod vers l’appelant. Cela active les vérifications de sécurité. Dans ce cas, aucun audit de sécurité n’est nécessaire, car les demandes d’autorisation sont transmises à l’appelant et/ou au domaine d’application. Les demandes d’autorisation sont étroitement contrôlées par le biais d’une stratégie de sécurité, d’un environnement d’hébergement et d’octrois d’autorisations de code source.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour