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.