CA2138: Métodos transparentes não devem chamar métodos com o atributo SuppressUnmanagedCodeSecurity

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

Um método de segurança transparente chama um método marcado com o SuppressUnmanagedCodeSecurityAttribute atributo.

Descrição da regra

Essa regra é acionado em qualquer método transparente que chama diretamente no código nativo, por exemplo, usando um via um P/Invoke (invocação de plataforma) chamada. Métodos de interoperabilidade P/Invoke e COM que são marcados com o SuppressUnmanagedCodeSecurityAttribute resultado de atributo em um LinkDemand sendo feito contra o método de chamada. Porque o código de segurança transparente não é possível atender a LinkDemands, o código também não é possível chamar métodos marcados com o atributo SuppressUnmanagedCodeSecurity ou métodos da classe é marcado com o atributo SuppressUnmanagedCodeSecurity. O método irá falhar ou a demanda será convertida em uma demanda completa.

Violações desta regra levam a uma MethodAccessException o modelo de transparência de segurança de nível 2, e uma solicitação total de UnmanagedCode no modelo de transparência de nível 1.

Como corrigir violações

Para corrigir uma violação desta regra, remova o SuppressUnmanagedCodeSecurityAttribute de atributo e marcar o método com o SecurityCriticalAttribute ou SecuritySafeCriticalAttribute atributo.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

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

}