Udostępnij za pośrednictwem


CA2118: Przegląd wykorzystania SuppressUnmanagedCodeSecurityAttribute

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Typ publiczny lub chroniony albo element członkowski ma atrybut SuppressUnmanagedCodeSecurityAttribute.

Opis reguły

Atrybut SuppressUnmanagedCodeSecurityAttribute zmienia domyślne zachowanie systemu zabezpieczeń dla elementów członkowskich, które wykonują kod niezarządzany za pomocą usługi międzyoperacyjnej modelu COM lub wywołania platformy.Ogólnie, system tworzy Dane i modelowanie w programie .NET Framework uprawnień do kodu niezarządzanego.Żądanie to występuje w czasie wykonywania dla każdego wywołania elementu członkowskiego i sprawdza uprawnienia każdego obiektu wywołującego na stosie wywołań.Gdy atrybut jest obecny, system tworzy Żądania połączeń dla uprawnienia: uprawnienia wywołującego bezpośrednio są sprawdzane, jeśli wywołujący jest skompilowany za pomocą kompilatora JIT.

Atrybut ten jest używany głównie, aby zwiększyć wydajność; jednak, wzrost wydajności powoduje znaczące zagrożenia bezpieczeństwa.Jeśli umieścisz ten atrybut w publicznych elementach członkowskich, które wywołują metody macierzyste, wywołujący na stosie wywołań (inni niż wywołujący bezpośrednio) nie potrzebują uprawnienia do kodu niezarządzanego, aby wykonywać kod niezarządzany.W zależności od działań publicznego elementu członkowskiego i obsługi danych wejściowych, może to zezwolić niezaufanym wywołującym na uzyskanie dostępu do funkcji zwykle ograniczonych do kodu zaufanego.

.NET Framework polega na kontroli zabezpieczeń, aby uniemożliwić wywołującym uzyskanie bezpośredniego dostępu do przestrzeni adresowej bieżącego procesu.Ponieważ atrybut ten omija normalne zabezpieczenia, kod użytkownika stanowi poważne zagrożenie, jeśli może zostać użyty do czytania lub pisania w pamięci procesu.Zauważ, że ryzyko nie jest ograniczone do metod, które celowo zapewniają dostęp do pamięci procesu; zagrożenie jest obecne w każdym scenariuszu, w którym złośliwy kod może uzyskać dostęp za pomocą wszelkich środków, na przykład, dostarczając zaskakujące, zniekształcone lub nieprawidłowe dane wejściowe.

Domyślne zasady zabezpieczeń nie udzielają zestawowi uprawnienia do kodu niezarządzanego, chyba że jest wykonywany na komputerze lokalnym lub jest elementem członkowskim jednej z następujących grup:

  • Grupa kodu Strefa mojego komputera

  • Grupa kodu Silna nazwa firmy Microsoft

  • Grupa kodu Silna nazwa stowarzyszenia ECMA

Jak naprawić naruszenia

Uważnie przejrzyj kod, aby upewnić się, że atrybut ten jest absolutnie konieczny.Jeśli temat zabezpieczeń kodu zarządzanego jest ciebie obcy lub nie rozumiesz implikacji wynikających z używania tego atrybutu, usuń go z kodu.Jeśli atrybut jest wymagany, upewnij się, że wywołujący nie mogą użyć kodu w złośliwy sposób.Jeśli kod nie ma uprawnień do wykonywania kodu niezarządzanego, atrybut ten nie ma żadnego skutku i powinien zostać usunięty.

Kiedy pominąć ostrzeżenia

Aby bezpiecznie pominąć ostrzeżenie dotyczące tej reguły, upewnij się, że kod nie przyznaje obiektom wywołującym dostępu do natywnych operacji lub zasobów, które mogą zostać użyte w destrukcyjny sposób.

Przykład

Poniższy przykład narusza regułę.

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

W poniższym przykładzie, metoda DoWork dostarcza dostępną publicznie ścieżkę kodu do metody wywołania platformy 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();
      }
   }
}

W poniższym przykładzie, publiczna metoda DoDangerousThing powoduje naruszenie.Aby rozwiązać naruszenie, metoda DoDangerousThing powinna zostać zmieniona na prywatną, a dostęp do niej powinien odbywać się przez publiczną metodę zabezpieczoną żądaniem zabezpieczeń, co ilustruje metoda DoWork.

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

Zobacz też

Informacje

SuppressUnmanagedCodeSecurityAttribute

Koncepcje

Optymalizacje zabezpieczeń

Żądania połączeń

Inne zasoby

Wytyczne dotyczące bezpiecznego programowania

Dane i modelowanie w programie .NET Framework