Compartir a través de


CA2141: Los métodos transparentes no deben satisfacer LinkDemands

Nombre de tipo

TransparentMethodsMustNotSatisfyLinkDemands

Identificador de comprobación

CA2141

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un método de seguridad transparente llama a un método de un ensamblado que no está marcado con el atributo AllowPartiallyTrustedCallersAttribute (APTCA), o un método de seguridad transparente satisface una SecurityAction.LinkDemand para un tipo o un método.

Descripción de la regla

Satisfacer un LinkDemand es una operación sensible a la seguridad que puede dar lugar a una elevación de privilegios involuntaria.El código transparente de seguridad no debe satisfacer LinkDemand, porque no está sujeto a los mismos requisitos de auditoría de seguridad que el código crítico para la seguridad.Los métodos transparentes en los ensamblados con un conjunto de reglas de seguridad de nivel 1 harán que todas las LinkDemands que satisfacen se conviertan peticiones completas en tiempo de ejecución, los cual puede producir problemas de rendimiento.En los ensamblados con el conjunto de reglas de seguridad de nivel 2, los métodos transparentes no se compilan en el compilador Just-In-Time (JIT) si intentan satisfacer una LinkDemand.

En ensamblados que usan seguridad de Nivel 2, los intentos de un método con seguridad transparente de satisfacer una LinkDemand o llamar a un método en un ensamblado no APTCA genera la MethodAccessException; en ensamblados de Nivel 1 LinkDemand se vuelve una Demanda completa.

Cómo corregir infracciones

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

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

En este ejemplo, un método transparente intenta llamar a un método que tiene una LinkDemand.Esta regla se desencadenará 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();
        }
    }
}