Sdílet prostřednictvím


CA5122: Deklarace volání nespravovaného kódu nesmí být kritické pro zabezpečení

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

CheckId

CA5122

Kategorie

Microsoft.Security

Narušující změna

Narušující

příčina

Deklarace P/Invoke byla označena atributem SecuritySafeCriticalAttribute:

[assembly: AllowPartiallyTrustedCallers]

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

V tomto příkladu byl atribut C.Beep(...) označen jako z hlediska zabezpečení bezpečně kritická metoda.

Popis pravidla

Metody jsou při provádění operace citlivé na zabezpečení označeny jako SecuritySafeCritical, ale lze je také bezpečně použít transparentním kódem.Jedním ze základních pravidel modelu transparentnosti zabezpečení je, že transparentní kód nikdy nesmí přímo volat nativní kód prostřednictvím deklarace P/Invoke.Proto označení P/Invoke jako bezpečně kritické z hlediska zabezpečení neumožní transparentnímu kódu vyvolat je a je zavádějící pro analýzu zabezpečení.

Jak vyřešit porušení

Aby byla deklarace P/Invoke zpřístupněna pro transparentní kód, vystavte pro něj z hlediska zabezpečení bezpečně kritickou obalující metodu.

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

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.