CA2118 : Revue de l’utilisation de SuppressUnmanagedCodeSecurityAttributeCA2118: Review SuppressUnmanagedCodeSecurityAttribute usage

TypeNameTypeName ReviewSuppressUnmanagedCodeSecurityUsageReviewSuppressUnmanagedCodeSecurityUsage
CheckIdCheckId CA2118CA2118
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Un type public ou protégé ou un membre a le System.Security.SuppressUnmanagedCodeSecurityAttribute attribut.A public or protected type or member has the System.Security.SuppressUnmanagedCodeSecurityAttribute attribute.

Description de la règleRule description

SuppressUnmanagedCodeSecurityAttribute modifie le comportement par défaut du système de sécurité pour les membres qui exécutent du code non managé à l’aide de COM interop ou plateforme de l’appel.SuppressUnmanagedCodeSecurityAttribute changes the default security system behavior for members that execute unmanaged code using COM interop or platform invocation. En général, le système effectue une données et modélisation pour l’autorisation de code non managé.Generally, the system makes a Data and Modeling for unmanaged code permission. Cette demande se produit au moment de l’exécution pour chaque appel du membre et vérifie chaque appelant dans la pile des appels pour l’autorisation.This demand occurs at run time for every invocation of the member, and checks every caller in the call stack for permission. Lorsque l’attribut est présent, le système effectue une demandes de liaison pour l’autorisation : les autorisations de l’appelant immédiat sont vérifiées lorsque l’appelant est compilé par JIT.When the attribute is present, the system makes a Link Demands for the permission: the permissions of the immediate caller are checked when the caller is JIT-compiled.

Cet attribut est essentiellement utilisé pour accroître les performances ; toutefois, les gains de performance s’accompagnent de risques substantiels pour la sécurité.This attribute is primarily used to increase performance; however, the performance gains come with significant security risks. Si vous placez l’attribut sur des membres publics qui appellent des méthodes natives, les appelants de la pile des appels (autre que l’appelant immédiat) n’avez pas besoin d’autorisation de code non managé pour exécuter du code non managé.If you place the attribute on public members that call native methods, the callers in the call stack (other than the immediate caller) do not need unmanaged code permission to execute unmanaged code. En fonction de gestion des entrées et actions du membre public, il peut autoriser des appelants non fiables pour accéder aux fonctionnalités normalement restreintes à du code fiable.Depending on the public member's actions and input handling, it might allow untrustworthy callers to access functionality normally restricted to trustworthy code.

Le .NET Framework.NET Framework s’appuie sur les vérifications de sécurité pour empêcher des appelants d’obtenir un accès direct à l’espace d’adressage du processus actuel.The .NET Framework.NET Framework relies on security checks to prevent callers from gaining direct access to the current process's address space. Étant donné que cet attribut contourne la sécurité normale, votre code constitue une menace sérieuse s’il peut être utilisé pour lire ou écrire dans la mémoire du processus.Because this attribute bypasses normal security, your code poses a serious threat if it can be used to read or write to the process's memory. Notez que le risque n’est pas limité aux méthodes qui conçus pour fournir des accès pour traiter la mémoire ; Il est également présent dans tout scénario où un code malveillant peut obtenir un accès par tout moyen, par exemple, en fournissant l’entrée surprenante, incorrecte ou non valide.Note that the risk is not limited to methods that intentionally provide access to process memory; it is also present in any scenario where malicious code can achieve access by any means, for example, by providing surprising, malformed, or invalid input.

La stratégie de sécurité par défaut n’accorde pas l’autorisation de code non managé à un assembly, sauf si elle s’exécute à partir de l’ordinateur local, soit un membre d’un des groupes suivants :The default security policy does not grant unmanaged code permission to an assembly unless it is executing from the local computer or is a member of one of the following groups:

  • Mon groupe de codes de Zone ordinateurMy Computer Zone Code Group

  • Groupe de codes de nom fort MicrosoftMicrosoft Strong Name Code Group

  • Groupe de codes de nom fort ECMAECMA Strong Name Code Group

Comment corriger les violationsHow to fix violations

Examinez soigneusement votre code pour vous assurer que cet attribut est absolument nécessaire.Carefully review your code to ensure that this attribute is absolutely necessary. Si vous n’êtes pas familiarisé avec la sécurité du code managé, ou que vous ne comprenez pas les implications de sécurité de l’utilisation de cet attribut, supprimez-le de votre code.If you are unfamiliar with managed code security, or do not understand the security implications of using this attribute, remove it from your code. Si l’attribut est requis, vous devez vous assurer que les appelants ne peuvent pas utiliser votre code à des fins malveillantes.If the attribute is required, you must ensure that callers cannot use your code maliciously. Si votre code n’a pas l’autorisation d’exécution de code non managé, cet attribut n’a aucun effet et doit être supprimé.If your code does not have permission to execute unmanaged code, this attribute has no effect and should be removed.

Quand supprimer les avertissementsWhen to suppress warnings

Pour supprimer sans risque un avertissement de cette règle, vous devez vous assurer que votre code ne fournit pas les appelants accès aux opérations natives ou les ressources qui peuvent être utilisées dans une action destructrice.To safely suppress a warning from this rule, you must ensure that your code does not provide callers access to native operations or resources that can be used in a destructive manner.

Exemple 1Example 1

L’exemple suivant enfreint la règle.The following example violates the rule.

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

Exemple 2Example 2

Dans l’exemple suivant, le DoWork méthode fournit un chemin d’accès de code publiquement accessible à la méthode d’appel de plateforme FormatHardDisk.In the following example, the DoWork method provides a publicly accessible code path to the platform invocation method 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();
      }
   }
}

Exemple 3Example 3

Dans l’exemple suivant, la méthode publique DoDangerousThing entraîne une violation.In the following example, the public method DoDangerousThing causes a violation. Pour résoudre la violation, DoDangerousThing doit être rendu privé et l’accès à ce dernier doit se faire par une méthode publique sécurisée par une demande de sécurité, comme illustré par la DoWork (méthode).To resolve the violation, DoDangerousThing should be made private, and access to it should be through a public method secured by a security demand, as illustrated by the DoWork method.

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

Voir aussiSee also