Condividi tramite


Rivedere l'utilizzo di SuppressUnmanagedCodeSecurityAttribute

Aggiornamento: novembre 2007

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Un membro o un tipo pubblico o protetto presenta l'attributo System.Security.SuppressUnmanagedCodeSecurityAttribute.

Descrizione della regola

L'oggetto SuppressUnmanagedCodeSecurityAttribute modifica il comportamento del sistema di protezione predefinito per i membri che eseguono codice non gestito mediante interoperabilità COM o chiamata al sistema operativo. In genere, il sistema esegue un Accesso dati per l'autorizzazione al codice non gestito. Questa richiesta viene effettuata in fase di esecuzione per ogni chiamata al membro e verifica l'autorizzazione di ogni chiamante nello stack di chiamate. Quando l'attributo è presente, il sistema esegue Richieste di collegamento per l'autorizzazione: le autorizzazioni del chiamante immediato vengono controllate quando il chiamante viene compilato tramite JIT.

Questo attributo viene principalmente utilizzato per aumentare le prestazioni. L'aumento delle prestazioni, tuttavia, comporta notevoli rischi in termini di protezione. Se si inserisce l'attributo su membri pubblici che chiamano metodi nativi, i chiamanti nello stack di chiamate diversi dal chiamante immediato non necessitano dell'autorizzazione al codice non gestito per eseguire tale codice. A seconda delle azioni del membro pubblico e della gestione dell'input, è possibile che venga consentito a chiamanti non attendibili di accedere a funzionalità normalmente limitate al codice attendibile.

.NET Framework si basa sui controlli di protezione per impedire ai chiamanti di ottenere l'accesso diretto allo spazio degli indirizzi del processo corrente. Poiché questo attributo ignora la protezione normale, il codice comporta una grave minaccia se può essere utilizzato per leggere o scrivere nella memoria del processo. Si noti che il rischio non è limitato ai metodi che forniscono intenzionalmente accesso alla memoria del processo, ma è presente in qualsiasi scenario in cui codice dannoso possa ottenere l'accesso in qualsiasi modo, ad esempio fornendo input improvviso, non corretto o non valido.

I criteri di sicurezza predefiniti non concedono l'autorizzazione al codice non gestito a un assembly, a meno che non venga eseguito dal computer locale o sia membro di uno dei gruppi riportati di seguito:

  • Gruppo di codice dell'area Risorse del Computer

  • Gruppo di codice Nome sicuro Microsoft

  • Gruppo di codice Nome sicuro ECMA

Correzione di violazioni

Rivedere attentamente il codice per assicurarsi che questo attributo sia assolutamente necessario. Se non si ha familiarità con la protezione del codice non gestito o non si comprendono le implicazioni di protezione derivanti dall'utilizzo di questo attributo, rimuoverlo dal codice. Se l'attributo è necessario, è necessario assicurarsi che i chiamanti non utilizzino il codice in modo dannoso. Se il codice non ha autorizzazione a eseguire codice non gestito, questo attributo non ha effetto e deve essere rimosso.

Esclusione di avvisi

Per escludere un avviso da questa regola in modo sicuro, è necessario assicurarsi che il codice non fornisca ai chiamanti accesso a operazioni native o risorse che possano essere utilizzate in modo distruttivo.

Esempio

Nell'esempio riportato di seguito viene violato il codice.

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.
      }
   }
}

Nell'esempio riportato di seguito, il metodo DoWork fornisce un percorso del codice accessibile pubblicamente al metodo di chiamata al sistema operativo 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();
      }
   }
}

Nell'esempio riportato di seguito, il metodo pubblico DoDangerousThing causa una violazione. Per risolvere la violazione, DoDangerousThing deve essere reso privato e l'accesso a esso deve essere effettuato tramite un metodo pubblico protetto da una richiesta di protezione, come illustrato dal metodo DoWork.

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

Vedere anche

Concetti

Ottimizzazioni della sicurezza

Richieste di collegamento

Riferimenti

System.Security.SuppressUnmanagedCodeSecurityAttribute

Altre risorse

Indicazioni per la generazione di codice protetto

Accesso dati