Partager via


CA5122 : les déclarations P/Invoke ne doivent pas être sécurisées

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

CheckId

CA5122

Catégorie

Microsoft.Security

Modification avec rupture

Rupture

Cause

Une déclaration P/Invoke a été marquée avec SecuritySafeCriticalAttribute:

[assembly: AllowPartiallyTrustedCallers]

// ...
public class C
{
    [SecuritySafeCritical]
    [DllImport("kernel32.dll")]
    public static extern bool Beep(int frequency, int duration); // CA5122 – safe critical p/invoke
   }

Dans cet exemple, C.Beep(...) a été marqué comme méthode critique sécurisée.

Description de la règle

Les méthodes sont marquées SecuritySafeCritical lorsqu'elles effectuent une opération relative à la sécurité, mais elle peuvent également être utilisées en toute sécurité par du code transparent.L'une des règles fondamentales de la transparence de la sécurité est que le code transparent peut ne jamais appeler directement le code natif via un P/Invoke.Par conséquent, marquer une méthode P/Invoke comme critique sécurisé ne permet pas au code transparent de l'appeler et s'avère trompeur pour l'analyse de sécurité.

Comment corriger les violations

Pour rendre un P/Invoke accessible au code transparent, vous devez lui exposer une méthode de wrapper critique sécurisée :

[assembly: AllowPartiallyTrustedCallers

class C
{
   [SecurityCritical]
   [DllImport(“kernel32.dll”, EntryPoint=”Beep”)]
   private static extern bool BeepPinvoke(int frequency, int duration); // Security Critical P/Invoke

   [SecuritySafeCritical]
   public static bool Beep(int frequency, int duration)
   {
      return BeepPInvoke(frequency, duration);
   }
}

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.