Udostępnij za pośrednictwem


CA2118: Przegląd wykorzystania SuppressUnmanagedCodeSecurityAttribute

Pozycja Wartość
Ruleid CA2118
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Publiczny lub chroniony typ lub element członkowski ma System.Security.SuppressUnmanagedCodeSecurityAttribute atrybut .

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

SuppressUnmanagedCodeSecurityAttribute Zmienia domyślne zachowanie systemu zabezpieczeń dla członków, którzy wykonują niezarządzany kod przy użyciu międzyoperatywnego modelu COM lub wywołania platformy. Ogólnie rzecz biorąc, system tworzy uprawnienia do tworzenia danych i modelowania dla niezarządzanego kodu. To zapotrzebowanie występuje w czasie wykonywania dla każdego wywołania elementu członkowskiego i sprawdza każdy obiekt wywołujący w stosie wywołań pod kątem uprawnień. Gdy atrybut jest obecny, system tworzy żądanie łącza dla uprawnienia: uprawnienia bezpośredniego obiektu wywołującego są sprawdzane, gdy obiekt wywołujący jest kompilowany w trybie JIT.

Atrybut ten jest używany głównie w celu zwiększenia wydajności; jednak wzrost wydajności powoduje znaczące zagrożenia dla bezpieczeństwa. Jeśli umieścisz atrybut na publicznych elementach członkowskich, które wywołają metody natywne, wywołujące w stosie wywołań (innym niż bezpośredni obiekt wywołujący) nie potrzebują niezarządzanego uprawnienia kodu do wykonywania niezarządzanego kodu. W zależności od akcji i obsługi danych wejściowych publicznego członka może to umożliwić niezaufanym obiektom wywołującym dostęp do funkcji zwykle ograniczonych do zaufanego kodu.

Platforma .NET opiera się na kontrolach zabezpieczeń, aby zapobiec uzyskiwaniu bezpośredniego dostępu do przestrzeni adresowej bieżącego procesu. Ponieważ ten atrybut pomija normalne zabezpieczenia, kod stanowi poważne zagrożenie, jeśli może służyć do odczytu lub zapisu w pamięci procesu. Należy pamiętać, że ryzyko nie jest ograniczone do metod, które celowo zapewniają dostęp do pamięci procesowej; Jest on również obecny w każdym scenariuszu, w którym złośliwy kod może uzyskać dostęp za pomocą dowolnych metod, na przykład przez zapewnienie zaskakujących, źle sformułowanych lub nieprawidłowych danych wejściowych.

Domyślne zasady zabezpieczeń nie udzielają niezarządzanego kodu do zestawu, chyba że są wykonywane z komputera lokalnego lub jest członkiem jednej z następujących grup:

  • Grupa kodów strefy komputera

  • Grupa kodów silnej nazwy firmy Microsoft

  • Grupa kodów silnej nazwy ECMA

Jak naprawić naruszenia

Dokładnie przejrzyj kod, aby upewnić się, że ten atrybut jest absolutnie niezbędny. Jeśli nie znasz zabezpieczeń kodu zarządzanego lub nie rozumiesz implikacji zabezpieczeń używania tego atrybutu, usuń go z kodu. Jeśli atrybut jest wymagany, należy się upewnić, że osoby wywołujące nie mogą używać kodu złośliwie. Jeśli kod nie ma uprawnień do wykonywania niezarządzanych kodów, ten atrybut nie ma żadnego wpływu i powinien zostać usunięty.

Kiedy pomijać ostrzeżenia

Aby bezpiecznie pominąć ostrzeżenie z tej reguły, należy upewnić się, że kod nie zapewnia obiektom wywołującym dostępu do natywnych operacji lub zasobów, które mogą być używane w sposób destrukcyjny.

Przykład 1

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

Przykład 2

W poniższym przykładzie DoWork metoda udostępnia publicznie dostępną ścieżkę kodu do metody FormatHardDiskwywołania platformy .

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

Przykład 3

W poniższym przykładzie metoda DoDangerousThing publiczna powoduje naruszenie. Aby rozwiązać ten problem, DoDangerousThing należy dokonać prywatnego dostępu i uzyskać do niego dostęp za pośrednictwem publicznej metody zabezpieczonej przez żądanie zabezpieczeń, jak pokazano w metodzie 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ż