CA2138: Los métodos transparentes no deben llamar a métodos con el atributo SuppressUnmanagedCodeSecurity
TypeName |
TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods |
Identificador de comprobación |
CA2138 |
Categoría |
Microsoft.Security |
Cambio problemático |
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);
}
}
}