Partilhar via


Revise o uso de SuppressUnmanagedCodeSecurityAttribute

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Quebrando

Causa

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

Descrição da regra

SuppressUnmanagedCodeSecurityAttribute Altera o comportamento padrão de segurança do sistema para membros que executar código não gerenciado, usando invocação de plataforma ou interoperabilidade COM. Em geral, o sistema faz um Dados do Access permissão de código não gerenciado. Essa demanda ocorre em time de execução para cada invocação do membro e verifica cada telefonar er no telefonar pilha permissão.Quando o atributo estiver presente, o sistema faz um Demandas de link a permissão de: 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 nativo, os chamadores na pilha de chamadas (diferente do chamador imediato) não são preciso 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 a funcionalidade de acesso normalmente é restringido ao código confiável.

The .NET Framework conta com verificações de segurança para impedir que os chamadores tenham acesso direto ao espaço de endereço do processo corrente. Como esse atributo ignora normais de segurança, seu código representa uma ameaça séria se pode ser usado para ler ou gravar em memória do processo.Observe que o risco não é limitado a métodos que fornecem acesso à memória de processo intencionalmente; também é 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álido.

A diretiva de segurança padrão não concede 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:

  • agrupar de códigos de zona Meu computador

  • agrupar de códigos Microsoft nome forte

  • agrupar de códigos de nome forte ECMA

Como corrigir violações

Revise cuidadosamente seu código para garantir que este atributo seja absolutamente necessário.Se você não estiver familiarizado com a segurança de código gerenciado ou não entende as implicações de segurança de usar esse atributo, remova-o 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 tiver permissão para executar o código não gerenciado, esse atributo não tem 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 fornece os 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, a 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 acesso a ele deve ser por meio de um método público protegido por uma demanda de segurança, sistema autônomo ilustrado pelo 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

Conceitos

Otimizações de segurança

Demandas de link

Referência

System.Security.SuppressUnmanagedCodeSecurityAttribute

Outros recursos

Diretrizes para Codificação Segura

Dados do Access