Partager via


CA2141 : Les méthodes transparentes ne répondent pas aux LinkDemands

TypeName

TransparentMethodsMustNotSatisfyLinkDemands

CheckId

CA2141

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Une méthode transparente de sécurité appelle une méthode dans un assembly qui n'est pas marqué avec l'attribut AllowPartiallyTrustedCallersAttribute (APTCA), ou une méthode transparente de sécurité satisfait un SecurityAction().LinkDemand pour un type ou une méthode.

Description de la règle

Répondre à un LinkDemand est une opération liée à la sécurité qui peut entraîner une élévation accidentelle des privilèges. Le code transparent de sécurité ne doit pas répondre aux LinkDemands car il n'est pas soumis aux mêmes exigences d'audit de sécurité que le code critique de sécurité. Les méthodes transparentes dans des assemblys de règles de sécurité de niveau 1 provoqueront la conversion de tous les LinkDemands qu'ils satisfont en demandes complètes au moment de l'exécution, ce qui peut provoquer des problèmes de performances. Dans les assemblys de niveau 2 de l'ensemble de règles de sécurité, les méthodes transparentes ne pourront pas être compilées dans le compilateur juste-à-temps (JIT) si elles essaient de satisfaire un LinkDemand.

Dans les assemblys de niveau 2 de sécurité, les tentatives par une méthode transparente de sécurité pour satisfaire un LinkDemand ou appeler une méthode dans un assembly non-APTCA déclenche un MethodAccessException ; dans les assemblys de niveau 1 le LinkDemand devient une demande complète.

Comment corriger les violations

Pour résoudre une violation de cette règle, marquez la méthode d'accès avec l'attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute ou supprimez le LinkDemand de la méthode accédée.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

Dans cet exemple, une méthode transparente essaie d'appeler une méthode qui a un LinkDemand. Cette règle déclenchera sur ce code.

using System;
using System.Security.Permissions;


namespace TransparencyWarningsDemo
{

    public class TransparentMethodSatisfiesLinkDemandsClass
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        public void LinkDemandMethod() { }


        public void TransparentMethod()
        {
            // CA2141 violation - transparent method calling a method protected with a link demand.  Any of the
            // following fixes will work here:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Remove the LinkDemand from LinkDemandMethod  (In this case, that would be recommended anyway
            //     since it's level 2 -- however you could imagine it in a level 1 assembly)
            LinkDemandMethod();
        }
    }
}