Compartir a través de


CA2138: Los métodos transparentes no deben llamar a métodos con el atributo SuppressUnmanagedCodeSecurity

Nombre de tipo

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

Identificador de comprobación

CA2138

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un método de seguridad transparente llama a un método que está marcado con el atributo SuppressUnmanagedCodeSecurityAttribute.

Descripción de la regla

Esta regla se desencadena en cualquier método transparente que llame directamente a código nativo, por ejemplo, utilizando una llamada a P/Invoke (invocación de plataforma).Los métodos de interoperabilidad COM y P/Invoke que están marcados con el atributo SuppressUnmanagedCodeSecurityAttribute hacen que se ejecute LinkDemand respecto al método de llamada.Debido a que el código transparente en seguridad no puede satisfacer LinkDemands, el código tampoco puede llamar a los métodos que están marcados con el atributo SuppressUnmanagedCodeSecurity, ni a los métodos de clase que están marcados con el atributo SuppressUnmanagedCodeSecurity.Se producirá un error en el método, o la demanda se convertirá en una demanda completa.

Las infracciones de esta regla conducen a una MethodAccessException en el modelo de transparencia de seguridad de nivel 2, y a una petición completa de UnmanagedCode en el modelo de transparencia de nivel 1.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el atributo SecurityCriticalAttribute y marque el método con el atributo SuppressUnmanagedCodeSecurityAttribute o SecuritySafeCriticalAttribute.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

using System;
using System.Runtime.InteropServices;
using System.Security;


namespace TransparencyWarningsDemo
{

    public class CallSuppressUnmanagedCodeSecurityClass
    {
        [SuppressUnmanagedCodeSecurity]
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool Beep(uint dwFreq, uint dwDuration);

        public void CallNativeMethod()
        {
            // CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
            // (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
            Beep(10000, 1);
        }
    }

}