Compartir a través de


CA2107: Revisar el uso de Deny y PermitOnly

Elemento Valor
RuleId CA2107
Category Microsoft.Security
Cambio importante Problemático

Causa

Un método contiene una comprobación de seguridad que especifica la acción de seguridad PermitOnly o Deny.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

La acción de seguridad System.Security.CodeAccessPermission.Deny solo la deben usar aquellos que tengan un conocimiento avanzado de la seguridad de .NET. Debería realizarse una revisión de la seguridad del código que utiliza estas acciones de seguridad.

Deny modifica el comportamiento predeterminado del recorrido de la pila que se produce en respuesta a una demanda de seguridad. Permite especificar permisos que no se deben conceder durante la duración del método de denegación, independientemente de los permisos reales de los llamadores de la pila de llamadas. Si el recorrido de pila detecta un método protegido por Deny y, si el permiso solicitado se incluye en los permisos denegados, se produce un error en el recorrido de la pila. PermitOnly también modifica el comportamiento predeterminado del recorrido de la pila. Permite que el código especifique solo los permisos que se pueden conceder, independientemente de los permisos de los llamadores. Si el recorrido de pila detecta un método protegido por PermitOnly y, si el permiso solicitado no se incluye en los permisos especificados por PermitOnly, se produce un error en el recorrido de la pila.

El código que se basa en estas acciones debe evaluarse cuidadosamente para detectar vulnerabilidades de seguridad debido a su utilidad limitada y comportamiento sutil. Tenga en cuenta lo siguiente.

  • Las peticiones de vínculo no se ven afectadas por Deny o PermitOnly.

  • Si Deny o PermitOnly se produce en el mismo marco de pila que la solicitud que provoca el recorrido de la pila, las acciones de seguridad no tienen ningún efecto.

  • Los valores que se usan para construir permisos basados en rutas de acceso normalmente se pueden especificar de varias maneras. Denegar el acceso a un formulario de la ruta de acceso no deniega el acceso a todos los formularios. Por ejemplo, si un recurso compartido de archivos \\Server\Share se asigna a una unidad de red X:, para denegar el acceso a un archivo del recurso compartido, debe denegar \\Server\Share\File, X:\File y todas las demás rutas de acceso que tengan acceso al archivo.

  • System.Security.CodeAccessPermission.Assert puede finalizar un recorrido de pila antes de que se alcance Deny o PermitOnly.

  • Si Deny tiene algún efecto, es decir, cuando un autor de la llamada tiene un permiso bloqueado por Deny, el autor de la llamada puede acceder directamente al recurso protegido, ignorando Deny. Del mismo modo, si el autor de la llamada no tiene el permiso denegado, se producirá un error en el recorrido de pila sin Deny.

Cómo corregir infracciones

Cualquier uso de estas acciones de seguridad provocará una infracción. Para corregir una infracción, no use estas acciones de seguridad.

Cuándo suprimir las advertencias

Suprima una advertencia de esta regla solo después de completar una revisión de seguridad.

Ejemplo 1

En el ejemplo siguiente se muestran algunas limitaciones de Deny. La biblioteca contiene una clase que tiene dos métodos idénticos, excepto las demandas de seguridad que los protegen.

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: ");
      }
   }
}

Ejemplo 2

En la aplicación siguiente se muestran los efectos de Deny en los métodos protegidos de la 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);
         }
      }
   }
}

Este ejemplo produce el siguiente resultado:

Demand: Caller's Deny has no effect on Demand with the asserted permission.
LinkDemand: Caller's Deny has no effect on LinkDemand with the asserted permission.
LinkDemand: Caller's Deny has no effect with LinkDemand-protected code.
LinkDemand: This Deny has no effect with LinkDemand-protected code.

Consulte también