Partilhar via


CA2118: Revise o uso de SuppressUnmanagedCodeSecurityAttribute

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. Geralmente, o sistema se torna um Modelagem e acesso a dados para 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 de 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 (diferente do chamador imediato) não precisam de 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 depende de verificações de segurança para impedir que os chamadores obtenham acesso direto ao espaço de endereço. do processo atual Porque este 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 em memória do processo. Observe que o risco não é limitado a métodos que intencionalmente fornecem acesso ao processo de memória; Ele também está presente em qualquer cenário onde 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 conceder 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ê estiver familiarizado com a segurança do código gerenciado ou não entende as implicações de segurança de usar esse atributo, você deve removê-lo do seu código. Se o atributo for necessário, você deve garantir que 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 nativas operações 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

Diretrizes para Codificação Segura

Otimizações de segurança

Demandas de link

Outros recursos

Modelagem e acesso a dados