Share via


CA2118: Verificare la sintassi di SuppressUnmanagedCodeSecurityAttribute

Articolo Valore
ID regola CA2118
Category Microsoft.Security
Modifica Interruzione

Causa

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

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

SuppressUnmanagedCodeSecurityAttribute modifica il comportamento predefinito del sistema di sicurezza per i membri che eseguono codice non gestito usando l'interoperabilità COM o la chiamata della piattaforma. In genere, il sistema effettua un'autorizzazione data e modellazione per il codice non gestito. Questa richiesta viene eseguita in fase di esecuzione per ogni chiamata del membro e controlla ogni chiamante nello stack di chiamate per l'autorizzazione. Quando l'attributo è presente, il sistema effettua richieste di collegamento per l'autorizzazione: le autorizzazioni del chiamante immediato vengono controllate quando il chiamante è compilato con JIT.

Questo attributo viene principalmente usato per aumentare le prestazioni. L'aumento delle prestazioni, tuttavia, comporta notevoli rischi in termini di sicurezza. Se si inserisce l'attributo su membri pubblici che chiamano metodi nativi, i chiamanti nello stack di chiamate (diverso dal chiamante immediato) non necessitano dell'autorizzazione di codice non gestito per eseguire codice non gestito. A seconda delle azioni e della gestione degli input del membro pubblico, potrebbe consentire ai chiamanti non attendibili di accedere alle funzionalità normalmente limitate al codice attendibile.

.NET si basa sui controlli di sicurezza per impedire ai chiamanti di ottenere l'accesso diretto allo spazio indirizzi del processo corrente. Poiché questo attributo ignora la normale sicurezza, il codice rappresenta una grave minaccia se può essere usato per leggere o scrivere nella memoria del processo. Si noti che il rischio non è limitato ai metodi che forniscono intenzionalmente l'accesso alla memoria di elaborazione; è presente anche in qualsiasi scenario in cui il codice dannoso può ottenere l'accesso con qualsiasi mezzo, ad esempio fornendo input sorprendente, in formato non valido o non valido.

I criteri di sicurezza predefiniti non concedono l'autorizzazione di codice non gestito a un assembly a meno che non sia in esecuzione dal computer locale o sia membro di uno dei gruppi seguenti:

  • Gruppo di codici dell'area computer

  • Gruppo di codice con nome sicuro Di Microsoft

  • Gruppo di codice ECMA con nome sicuro

Come correggere le violazioni

Esaminare attentamente il codice per assicurarsi che questo attributo sia assolutamente necessario. Se non si ha familiarità con la sicurezza del codice gestito o non si conoscono le implicazioni di sicurezza dell'uso di questo attributo, rimuoverlo dal codice. Se l'attributo è obbligatorio, è necessario assicurarsi che i chiamanti non possano usare il codice in modo dannoso. Se il codice non dispone dell'autorizzazione per eseguire codice non gestito, questo attributo non ha alcun effetto e deve essere rimosso.

Quando eliminare gli avvisi

Per eliminare in modo sicuro un avviso da questa regola, è necessario assicurarsi che il codice non fornisca ai chiamanti l'accesso alle operazioni native o alle risorse che possono essere usate in modo distruttivo.

Esempio 1

Nell'esempio seguente viene violata la regola.

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

Esempio 2

Nell'esempio seguente il DoWork metodo fornisce un percorso di codice accessibile pubblicamente al metodo FormatHardDiskdi chiamata della piattaforma .

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

Esempio 3

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

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

Vedi anche