CA2141: Los métodos transparentes no deben satisfacer LinkDemands

Elemento Valor
RuleId CA2141
Category Microsoft.Security
Cambio importante Problemático

Causa

Un método transparente en seguridad llama a un método de un ensamblado no marcado con el atributo AllowPartiallyTrustedCallersAttribute(APTCA) o bien satisface un SecurityAction.LinkDemand de un tipo o método.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Satisfacer un LinkDemand es una operación confidencial de seguridad que puede provocar una elevación involuntaria de privilegios. El código transparente de seguridad no debe satisfacer LinkDemands, ya que no está sujeto a los mismos requisitos de auditoría de seguridad que un código crítico para la seguridad. Los métodos transparentes de los conjuntos de nivel 1 del conjunto de reglas de seguridad harán que todos los LinkDemands que cumplan se conviertan en demandas completas en tiempo de ejecución, lo que puede causar problemas de rendimiento. En los conjuntos de nivel 2 del conjunto de reglas de seguridad, los métodos transparentes no se compilarán en el compilador Just-In-Time (JIT) si intentan satisfacer un LinkDemand.

En los conjuntos que usan la seguridad de nivel 2, los intentos de un método transparente de seguridad para satisfacer un LinkDemand o llamar a un método en un ensamblado que no sea APTCA generan un MethodAccessException; en los conjuntos de nivel 1, LinkDemand se convierte en una demanda completa.

Cómo corregir infracciones

Para corregir una infracción de esta regla, marque el método de acceso con el atributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute quite LinkDemand del método al que se accede.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo

En este ejemplo, un método transparente intenta llamar a un método que tiene un linkDemand. Esta regla se activará en este código.

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