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