Condividi tramite


Controllare l'utilizzo di Deny e PermitOnly

Aggiornamento: novembre 2007

TypeName

ReviewDenyAndPermitOnlyUsage

CheckId

CA2107

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Un metodo contiene un controllo di protezione che specifica l'azione di protezione PermitOnly o Deny.

Descrizione della regola

Le azioni di protezione Utilizzo del metodo PermitOnly e CodeAccessPermission.Deny devono essere utilizzate esclusivamente da utenti che possiedono una conoscenza approfondita della protezione .NET Framework. Il codice che utilizza queste azioni di protezione deve essere sottoposto a una revisione della protezione.

Deny altera il comportamento predefinito del percorso chiamate nello stack che si verifica in risposta a una richiesta di sicurezza. Consente di specificare le autorizzazioni che non devono essere concesse per la durata del metodo Deny, indipendentemente dalle autorizzazioni effettive dei chiamanti nello stack di chiamate. Se nel percorso stack viene rilevato un metodo protetto da Deny e l'autorizzazione richiesta è inclusa nelle autorizzazioni negate, il percorso stack avrà esito negativo. Anche PermitOnly altera il comportamento predefinito del percorso chiamate nello stack. Consente al codice di specificare solo le autorizzazioni che è possibile concedere, indipendentemente dalle autorizzazioni dei chiamanti. Se nel percorso stack viene rilevato un metodo protetto da PermitOnly e le autorizzazioni richieste non sono incluse nelle autorizzazioni specificate da PermitOnly, il percorso stack avrà esito negativo.

Il codice che si basa su queste azioni deve essere valutato attentamente per individuarne le vulnerabilità di protezione a causa della limitata utilità e del particolare comportamento. Si consideri quanto segue:

  • Deny e PermitOnly non hanno effetto su Richieste di collegamento.

  • Se Deny o PermitOnly si verifica nello stesso stack frame della richiesta che causa il percorso stack, le azioni di protezione non avranno effetto.

  • I valori utilizzati per costruire le autorizzazioni basate su percorso possono in genere essere specificati in molti modi. Negando l'accesso a un formato del percorso non si nega l'accesso a tutte le forme. Se ad esempio una condivisione file \\Server\Condivisione è mappata su un'unità di rete X:, per negare l'accesso a un file in tale condivisione sarà necessario negare \\Server\Condivisione\File, X:\File e ogni altro percorso che consente di accedere al file.

  • Un metodo CodeAccessPermission.Assert può terminare un percorso stack prima che venga raggiunta l'operazione Deny o PermitOnly.

  • Se l'operazione Deny produce un qualsiasi effetto, ovvero se un'autorizzazione di un chiamante è bloccata da Deny, il chiamante potrà accedere direttamente alla risorsa protetta, ignorando Deny. Analogamente, se il chiamante non dispone dell'autorizzazione negata, il percorso stack avrà esito negativo senza l'operazione Deny.

Correzione di violazioni

Qualsiasi utilizzo di queste azioni di protezione causerà una violazione. Per correggere una violazione, non utilizzare queste azioni di protezione.

Esclusione di avvisi

Escludere un avviso da questa regola dopo aver completato una revisione della sicurezza.

Esempio

Nell'esempio riportato di seguito vengono illustrate alcune limitazioni di Deny.

La libreria riportata di seguito contiene una classe con due metodi identici, ad eccezione delle richieste di protezione che li proteggono.

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

L'applicazione riportata di seguito dimostra gli effetti di Deny sui metodi protetti della libreria.

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

Questo esempio produce l'output che segue.

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.

Vedere anche

Concetti

Override dei controlli di protezione

Utilizzo del metodo PermitOnly

Riferimenti

CodeAccessPermission.PermitOnly

CodeAccessPermission.Assert

CodeAccessPermission.Deny

IStackWalk.PermitOnly

Altre risorse

Indicazioni per la generazione di codice protetto