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 s’exécutent à l’aide de COM interop ou plateforme de l’appel de code non managé.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 un 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 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 un les 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 dans la pile des appels (autre que l’appelant immédiat) est inutile des autorisations 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 de l’entrée et actions du membre public, pourrait permettre à 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 grave 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é à méthodes qui fournissent l’accès au processus mémoire ; intentionnellement Il est également présent dans tout scénario où code nuisible peut atteindre l’accès par quelque moyen que, par exemple, en fournissant l’entrée étonnant, 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 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

Lisez attentivement 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écuter du 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 ressources qui peuvent être utilisés dans une action destructrice ou des opérations natives.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.

ExempleExample

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

ExempleExample

Dans l’exemple suivant, la 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();
      }
   }
}

ExempleExample

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 corriger la violation, DoDangerousThing doit être rendu privée, et l’accès à ce dernier doit être via une méthode publique sécurisée par une demande de sécurité, comme illustré par le 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

System.Security.SuppressUnmanagedCodeSecurityAttribute
Instructions de codage sécurisé Secure Coding Guidelines
Données et modélisationData and Modeling
Demandes de liaisonLink Demands