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

Avertissements liés à la sécurité