Partilhar via


CA2107: Revisão negar e permitir o uso de apenas

TypeName

ReviewDenyAndPermitOnlyUsage

CheckId

CA2107

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

Um método contém uma verificação de segurança que especifica a ação de segurança PermitOnly ou Deny.

Descrição da regra

O Usando o método PermitOnly e CodeAccessPermission.Deny ações de segurança devem ser usadas somente por aqueles que possuem um conhecimento avançado de .NET Framework de segurança. Código que usa essas ações de segurança deve passar por uma revisão de segurança.

Negar altera o comportamento padrão, a movimentação de pilha ocorre em resposta a uma demanda de segurança. Permite que você especifique as permissões que não devem ser concedidas para a duração do método está negando, independentemente das permissões reais do que os chamadores na pilha de chamadas. Se a stack walk detecta um método protegido pelo Deny e se a permissão exigida estiver incluído nas permissões negadas, a stack walk falha. PermitOnly também altera o comportamento padrão do stack walk. Ele permite que o código especificar somente essas permissões podem ser concedidas, independentemente das permissões do que os chamadores. Se a stack walk detecta um método protegido pelo PermitOnly e se a permissão exigida não está incluído nas permissões que são especificadas pelo PermitOnly, a stack walk falha.

Código que depende dessas ações deve ser avaliado cuidadosamente para vulnerabilidades de segurança devido a sua utilidade limitada e o comportamento sutil. Considere o seguinte:

  • Demandas de linknão são afetados por Deny ou PermitOnly.

  • Se o Deny ou PermitOnly ocorre no mesmo quadro de pilha como a demanda que faz a stack walk, as ações de segurança não terão efeito.

  • Os valores são usados para construir as permissões de caminho geralmente podem ser especificados de várias maneiras. Negar acesso a um formulário do caminho não nega acesso a todos os formulários. Por exemplo, se um \\servidor\compartilhamento de compartilhamento de arquivo é mapeada para uma unidade de rede x:, para negar acesso a um arquivo no compartilhamento, você deve negar \\Server\Share\File, X:\File e cada caminho que acessa o arquivo.

  • Um CodeAccessPermission.Assert pode encerrar uma stack walk antes o Deny ou PermitOnly é alcançado.

  • Se uma negação tem qualquer efeito, especificamente, quando um chamador possui uma permissão que é bloqueada pelo Deny, o chamador pode acessar o recurso protegido diretamente, ignorando a negar. Da mesma forma, se o chamador não tem a permissão negada, o stack walk falhará sem negar.

Como corrigir violações

Qualquer uso dessas ações de segurança causará uma violação. Para corrigir uma violação, não use essas ações de segurança.

Quando suprimir avisos

Elimina um aviso esta regra somente depois de concluir uma revisão de segurança.

Exemplo

O exemplo a seguir demonstra algumas limitações de negar.

A seguinte biblioteca contém uma classe que tem dois métodos são idênticos exceto para as demandas de segurança protegê-los.

using System.Security;
using System.Security.Permissions;
using System;

namespace SecurityRulesLibrary
{
   public  class SomeSecuredMethods
   {

      // Demand immediate caller has suitable permission
      // before revealing sensitive data.
      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByLinkDemand()
      {
         Console.Write("LinkDemand: ");
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByDemand()
      {
         Console.Write("Demand: ");
      }
   }
}

O aplicativo a seguir demonstra os efeitos de negar nos métodos protegidos da biblioteca.

using System.Security;
using System.Security.Permissions;
using System;
using SecurityRulesLibrary;

namespace TestSecurityLibrary
{
    // Violates rule: ReviewDenyAndPermitOnlyUsage.
   public class TestPermitAndDeny
   {
      public static void TestAssertAndDeny()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
               EnvironmentPermissionAccess.Read,
               "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Assert();
         try
         {
            SomeSecuredMethods.MethodProtectedByDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on Demand " + 
               "with the asserted permission.");

            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on LinkDemand " + 
               "with the asserted permission.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}", e);
         }
      }

      public static void TestDenyAndLinkDemand()
      {
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect with " +
               "LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}",e);
         }
      }

      public static void Main()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,
            "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Deny();

         //Test Deny and Assert interaction for LinkDemands and Demands.
         TestAssertAndDeny();

         //Test Deny's effects on code in different stack frame. 
         TestDenyAndLinkDemand();

         //Test Deny's effect on code in same frame as deny.
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "This Deny has no effect with LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine("This Deny protected the library.{0}",e);
         }
      }
   }
}

O exemplo produz a seguinte saída.

          

Consulte também

Referência

CodeAccessPermission.PermitOnly

CodeAccessPermission.Assert

CodeAccessPermission.Deny

IStackWalk.PermitOnly

Conceitos

Diretrizes para Codificação Segura

Substituindo as verificações de segurança

Usando o método PermitOnly