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