CA2118: обзор использования SuppressUnmanagedCodeSecurityAttribute

Товар Значение
Идентификатор правила CA2118
Категория Microsoft.Security
Критическое изменение Критическое

Причина

У общедоступного или защищенного типа или члена есть System.Security.SuppressUnmanagedCodeSecurityAttribute атрибут.

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

Описание правила

SuppressUnmanagedCodeSecurityAttribute изменяет поведение системы безопасности по умолчанию для членов, выполняющих неуправляемый код с помощью com-взаимодействия или вызова платформы. Как правило, система делает данные и моделирование для неуправляемого разрешения на код. Это требование возникает во время выполнения для каждого вызова члена и проверка каждый вызывающий объект в стеке вызовов для разрешения. При наличии атрибута система выполняет запросы ссылки на разрешение: разрешения немедленного вызывающего объекта проверка при компиляции вызывающего объекта JIT.

Этот атрибут служит в основном для повышения производительности; однако, прирост производительности сопряжен со значительными рисками безопасности. Если атрибут помещется на общедоступные члены, вызывающие собственные методы, вызывающие в стеке вызовов (кроме немедленного вызывающего элемента), не требуют разрешения на неуправляемый код для выполнения неуправляемого кода. В зависимости от действий и обработки входных данных общедоступного члена может позволить ненадежным вызывающим пользователям получать доступ к функциям, которые обычно ограничены надежным кодом.

.NET использует проверка безопасности, чтобы предотвратить прямой доступ вызывающих пользователей к адресной области текущего процесса. Так как этот атрибут проходит обычную безопасность, код представляет серьезную угрозу, если его можно использовать для чтения или записи в память процесса. Обратите внимание, что риск не ограничивается методами, которые намеренно предоставляют доступ к памяти процесса; Он также присутствует в любом сценарии, когда вредоносный код может достичь доступа любым способом, например путем предоставления удивительных, неправильных или недопустимых входных данных.

Политика безопасности по умолчанию не предоставляет неуправляемое разрешение на сборку, если она не выполняется с локального компьютера или является членом одной из следующих групп:

  • Группа кода зоны компьютера

  • Группа кода строгого имени Майкрософт

  • Группа кода строгого имени ECMA

Устранение нарушений

Внимательно просмотрите код, чтобы убедиться, что этот атрибут абсолютно необходим. Если вы не знакомы с безопасностью управляемого кода или не понимаете последствия использования этого атрибута, удалите его из кода. Если атрибут является обязательным, необходимо убедиться, что вызывающие пользователи не могут использовать ваш код злонамеренно. Если код не имеет разрешения на выполнение неуправляемого кода, этот атрибут не действует и не должен быть удален.

Когда лучше отключить предупреждения

Чтобы безопасно отключить предупреждение из этого правила, необходимо убедиться, что код не предоставляет вызывающим абонентам доступ к собственным операциям или ресурсам, которые могут использоваться в деструктивном способе.

Пример 1

В следующем примере нарушается правило.

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

Пример 2

В следующем примере DoWork метод предоставляет общедоступный путь кода к методу 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();
      }
   }
}

Пример 3

В следующем примере открытый метод DoDangerousThing вызывает нарушение. Чтобы устранить нарушение, DoDangerousThing следует сделать закрытым, а доступ к нему должен осуществляться через общедоступный метод, защищенный требованием безопасности, как показано в методе 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();
      }
   }
}

См. также