Поделиться через


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

Обновлен: Ноябрь 2007

TypeName

ReviewSuppressUnmanagedCodeSecurityUsage

CheckId

CA2118

Категория

Microsoft.Security

Критическое изменение

Критическое

Причина

Открытый или защищенный тип или член имеет атрибут System.Security.SuppressUnmanagedCodeSecurityAttribute.

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

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

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

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

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

  • Группа кода "My Computer Zone"

  • Группа кода "Microsoft Strong Name"

  • Группа кода "ECMA Strong Name"

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

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

Отключение предупреждений

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

Пример

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

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

В следующем примере метод 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();
      }
   }
}

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

См. также

Основные понятия

Оптимизация безопасности

Требования связывания

Ссылки

System.Security.SuppressUnmanagedCodeSecurityAttribute

Другие ресурсы

Правила написания безопасного кода

Доступ к данным