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();
}
}
}