Udostępnij za pośrednictwem


CA5122 Deklaracje P/Invoke nie powinny być bezpieczne-krytyczne

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

CheckId

CA5122

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Deklaracja metody P/Invoke została oznaczona jako SecuritySafeCriticalAttribute:

[assembly: AllowPartiallyTrustedCallers]

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

W tym przykładzie metoda C.Beep(...) została oznaczona jako bezpieczna-krytyczna pod względem zabezpieczeń.

Opis reguły

Metody są oznaczone jako SecuritySafeCritical, gdy wykonują operacje zależne od zabezpieczeń, ale mogą być również bezpiecznie używane przez kod przezroczystości.Jedną z podstawowych reguł zabezpieczeń modelu przezroczystości jest to, że przezroczysty kod nigdy nie może bezpośrednio wywołać kodu natywnego za pośrednictwem metody P/Invoke.Dlatego oznakowanie metody P/Invoke jako bezpiecznej-krytycznej pod względem zabezpieczeń nie umożliwi jej wywołania kodu przezroczystości i jest mylące dla analizy zabezpieczeń.

Jak naprawić naruszenia

Aby metoda P/Invoke stała się dostępna dla przejrzystego kodu, należy ujawnić dla niej bezpieczną-krytyczną pod względem zabezpieczeń metodę dla otoki:

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

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.