Partilhar via


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

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

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

Descrição da Regra

Esta regra é acionado em qualquer método transparente que chamar diretamente em código nativo, por exemplo, usando a através de uma chamada de invocação de plataforma (P/Invoke).Métodos de interoperabilidade de P/Invoke e de COM que são marcados com o resultado do atributo de SuppressUnmanagedCodeSecurityAttribute em um LinkDemand que está sendo feita no método de chamada.Como o código transparente de segurança não pode atender LinkDemands, o código também não pode chamar os métodos que são marcados com o atributo de SuppressUnmanagedCodeSecurity, ou os métodos da classe que é marcada com atributo de SuppressUnmanagedCodeSecurity.Haverá falha no método, ou a demanda será convertida em uma procura completa.

As violações desta regra resultam em MethodAccessException no modelo de transparência da segurança de nível 2, e uma procura completa para UnmanagedCode no modelo de transparência de nível 1.

Como Corrigir Violações

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

Quando Suprimir Alertas

Não elimine um alerta desta 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);
        }
    }

}