Partilhar via


CA2118: revisar uso de SuppressUnmanagedCodeSecurityAttribute

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Um público ou um tipo ou membro protegido têm o atributo de SuppressUnmanagedCodeSecurityAttribute .

Descrição da Regra

SuppressUnmanagedCodeSecurityAttribute altera o comportamento do sistema de segurança padrão para os membros que executam código não gerenciado usando o interoperabilidade COM ou a invocação de preparo.Em geral, o sistema faz Dados e modelagem no .NET Framework para a permissão de código não gerenciado.Essa solicitação ocorre em tempo de execução para cada invocação de membro, e verifica todo o chamador na pilha de chamadas para a permissão.Quando o atributo estiver presente, o sistema faz Demandas de link para a permissão: as permissões do chamador imediata são verificadas quando o chamador JIT- é criado.

Este atributo é usado principalmente para aumentar o desempenho; no entanto, os ganhos de desempenho vêm com riscos de segurança significativos.Se você colocar o atributo nos membros públicos que chamam métodos nativos, os chamadores na pilha de chamadas (diferente do chamador imediata) não precisam da permissão de código não gerenciado executar o código não gerenciado.Dependendo das ações e a manipulação de entrada do membro público, pode permitir que os chamadores untrustworthy acessar a funcionalidade limitada normalmente ao código confiável.

.NET Framework confia em verificações de segurança para impedir que os chamadores ganhem acesso direto ao espaço de endereço atual do processo.Como esse atributo ignora a segurança normal, o código gerará uma ameaça registra se pode ser usado para ler ou gravar na memória do processo.Observe que o risco não está limitado aos métodos que fornecem intencionalmente o acesso à memória do processo; também está presente em qualquer cenário onde o código mal-intencionado pode obter acesso por qualquer meio, por exemplo, a entrada surpreendente, danificado, ou inválido de entrega.

A política de segurança padrão não concede a permissão de código não gerenciado em um assembly a menos que esteja executando no computador local ou membro de um dos seguintes grupos:

  • Meu grupo de códigos de fuso horário do computador

  • Grupo de códigos de nome forte do Microsoft

  • Grupo de códigos de nome forte de ECMA

Como Corrigir Violações

Revise cuidadosamente seu código para garantir que esse atributo seja absolutamente necessário.Se você não estiver familiarizado com segurança de código gerenciado, ou não inclui as implicações de segurança de uso desse atributo, exclua-o de seu código.Se o atributo for necessário, você deve assegurar que os chamadores não pode usar seu código maliciosamente.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 removida.

Quando Suprimir Alertas

Para suprimir com segurança um aviso desta regra, você deve garantir que seu código não fornece chamadores acesso a operações nativos ou para recursos que podem ser usados em uma forma 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 método de DoWork fornece um caminho publicamente acessível de código para o método FormatHardDiskde invocação da plataforma.

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 causar uma violação.Para resolver a violação, DoDangerousThing deve ser feito particular e, o acesso a ele deve ser a um método público protegido por uma procura de segurança, como ilustrado pelo método de DoWork .

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

SuppressUnmanagedCodeSecurityAttribute

Conceitos

Otimizações de segurança

Demandas de link

Outros recursos

Diretrizes de codificação segura

Dados e modelagem no .NET Framework