Partilhar via


CA2118: Uso de SuppressUnmanagedCodeSecurityAttribute de revisão

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

Um tipo de público ou protegido ou membro tem o System.Security.SuppressUnmanagedCodeSecurityAttribute atributo.

Descrição da regra

SuppressUnmanagedCodeSecurityAttributeAltera o comportamento do sistema de segurança padrão para membros que executar o código não gerenciado usando invocação de plataforma ou de interoperabilidade COM.Em geral, o sistema se torna um Dados e modelagem da.NET Framework permissão de código não gerenciado.Essa demanda ocorre em tempo de execução para cada invocação do membro e verifica cada chamador na pilha de chamadas para permissão.Quando o atributo estiver presente, o sistema faz uma Demandas de link para a permissão: as permissões do chamador imediato são verificadas quando o chamador é compilado em JIT.

Esse atributo é usado principalmente para aumentar o desempenho; No entanto, o desempenho ganha vêm com consideráveis riscos à segurança.Se você colocar o atributo em membros públicos que chamam métodos nativos, os chamadores na pilha de chamadas (que não seja o chamador imediato) não é necessário a permissão de código não gerenciado para executar o código não gerenciado.Dependendo do membro público ações e manipulação de entrada, ele pode permitir que chamadores não confiáveis para acessar funcionalidades normalmente restringidas ao código confiável.

O .NET Framework se baseia em verificações de segurança para impedir que os chamadores tenham acesso direto ao espaço de endereço do processo atual.Como esse atributo ignora normais de segurança, o seu código representa uma ameaça séria, se ele pode ser usado para ler ou gravar na memória do processo.Observe que o risco não é limitado a métodos que intencionalmente fornecem acesso para processar a memória; Ele também está presente em qualquer cenário em que código mal-intencionado pode obter acesso por qualquer meio, por exemplo, fornecendo entrada surpreendente, malformada ou inválida.

A diretiva de segurança padrão não concede a permissão de código não gerenciado para um assembly, a menos que ele está em execução no computador local ou um membro de um dos seguintes grupos:

  • Grupo de códigos de zona Meu computador

  • Grupo de códigos de nome de alta segurança Microsoft

  • Grupo de códigos de nome forte ECMA

Como corrigir violações

Leia com atenção o seu código para garantir que este atributo seja absolutamente necessário.Se você não estiver familiarizado com a segurança do código gerenciado ou não entende as implicações de segurança de usar esse atributo, remova-o em seu código.Se o atributo for necessário, você deve garantir que os chamadores não podem usar seu código de maneira mal-intencionada.Se seu código não tem permissão para executar o código não gerenciado, esse atributo não tem nenhum efeito e deve ser removido.

Quando suprimir avisos

Para suprimir com segurança um aviso da regra, você deve garantir que seu código não fornecer chamadores acesso a operações nativas ou recursos que podem ser usados de maneira destrutiva.

Exemplo

O exemplo a seguir viola a regra.

using System.Security;

// These two classes are identical
// except for the location of the attribute.

namespace SecurityRulesLibrary
{
    public class MyBadMemberClass
   {
      [SuppressUnmanagedCodeSecurityAttribute()]
      public void DoWork()
      {
         FormatHardDisk();
      }

      void FormatHardDisk()
      {
         // Code that calls unmanaged code.
      }
   }

   [SuppressUnmanagedCodeSecurityAttribute()]
   public class MyBadTypeClass
   {
      public void DoWork()
      {
         FormatHardDisk();
      }

      void FormatHardDisk()
      {
         // Code that calls unmanaged code.
      }
   }
}

No exemplo a seguir, o DoWork método fornece um caminho de código publicamente acessíveis para o método de invocação de plataforma FormatHardDisk.

using System.Security;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   public class SuppressIsOnPlatformInvoke
   {
      // The DoWork method is public and provides unsecured access
      // to the platform invoke method FormatHardDisk.
      [SuppressUnmanagedCodeSecurityAttribute()]
      [DllImport("native.dll")]

      private static extern void FormatHardDisk();
      public void DoWork()
      {
         FormatHardDisk();
      }
   }

   // Having the attribute on the type also violates the rule.
   [SuppressUnmanagedCodeSecurityAttribute()]
   public class SuppressIsOnType
   {
      [DllImport("native.dll")]

      private static extern void FormatHardDisk();
      public void DoWork()
      {
         FormatHardDisk();
      }
   }
}

No exemplo a seguir, o método público DoDangerousThing causa uma violação.Para resolver a violação, DoDangerousThing deve ser feita em particular e o acesso a ele deve ser por meio de um método público, protegido por uma demanda de segurança, como ilustrado pela DoWork método.

using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   [SuppressUnmanagedCodeSecurityAttribute()]
   public class BadTypeWithPublicPInvokeAndSuppress
   {
      [DllImport("native.dll")]

      public static extern void DoDangerousThing();
      public void DoWork()
      {
         // Note that because DoDangerousThing is public, this 
         // security check does not resolve the violation.
         // This only checks callers that go through DoWork().
         SecurityPermission secPerm = new SecurityPermission(
            SecurityPermissionFlag.ControlPolicy | 
            SecurityPermissionFlag.ControlEvidence
         );
         secPerm.Demand();
         DoDangerousThing();
      }
   }
}

Consulte também

Referência

System.Security.SuppressUnmanagedCodeSecurityAttribute

Conceitos

Otimizações de segurança

Demandas de link

Outros recursos

Diretrizes para codificação segura

Dados e modelagem da.NET Framework