CA2107: проверьте использование deny и permit only

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

Причина

Метод содержит проверка безопасности, указывающий действие PermitOnly или Deny безопасности.

Примечание.

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

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

Действие System.Security.CodeAccessPermission.Deny безопасности должно использоваться только теми, кто имеет расширенные знания о безопасности .NET. Код, который использует эти действия безопасности, должен быть тщательно проанализирован на предмет безопасности.

Запрет изменяет поведение по умолчанию для пошагового выполнения стека, которое происходит в ответ на запрос безопасности. Он позволяет указать разрешения, которые не должны быть предоставлены в течение длительности метода запрета, независимо от фактических разрешений вызывающих объектов в стеке вызовов. Если пошаговое руководство по стеку обнаруживает метод, защищенный запретом, и если требуемые разрешения включены в запрещенные разрешения, стек завершается сбоем. PermitOnly также изменяет поведение по умолчанию для пошагового шага стека. Он позволяет коду указывать только те разрешения, которые могут быть предоставлены независимо от разрешений вызывающих лиц. Если пошаговое руководство по стеку обнаруживает метод, защищенный permitOnly, и если требуемые разрешения не включены в разрешения, указанные в PermitOnly, стек завершается ошибкой.

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

  • Запросы ссылок не влияют на запрет или разрешение.

  • Если параметр Deny или PermitOnly возникает в том же кадре стека, что и запрос, вызывающий пошаговое выполнение стека, действия безопасности не влияют.

  • Значения, используемые для создания разрешений на основе пути, обычно могут быть заданы несколькими способами. Запрет доступа к одной форме пути не запрещает доступ ко всем формам. Например, если файловый ресурс \\Server\Share сопоставляется с сетевым диском X:, чтобы запретить доступ к файлу в общей папке, необходимо запретить \\Server\Share\File, X:\File и каждый другой путь, который обращается к файлу.

  • Можно System.Security.CodeAccessPermission.Assert завершить пошаговое руководство по стеку до достижения запрета или разрешения.

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

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

Любое использование этих действий безопасности приведет к нарушению. Чтобы устранить нарушение, не используйте эти действия безопасности.

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

Отключайте предупреждение из этого правила только после завершения проверки безопасности.

Пример 1

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

using System.Security;
using System.Security.Permissions;
using System;

namespace SecurityRulesLibrary
{
   public  class SomeSecuredMethods
   {
    
      // Demand immediate caller has suitable permission
      // before revealing sensitive data.
      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByLinkDemand()
      {
         Console.Write("LinkDemand: ");
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByDemand()
      {
         Console.Write("Demand: ");
      }
   }
}

Пример 2

В приведенном ниже приложении показано влияние Запрета на защищенные методы из библиотеки.

using System.Security;
using System.Security.Permissions;
using System;
using SecurityRulesLibrary;

namespace TestSecurityLibrary
{
    // Violates rule: ReviewDenyAndPermitOnlyUsage.
   public class TestPermitAndDeny
   {
      public static void TestAssertAndDeny()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
               EnvironmentPermissionAccess.Read,
               "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Assert();
         try
         {
            SomeSecuredMethods.MethodProtectedByDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on Demand " + 
               "with the asserted permission.");

            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on LinkDemand " + 
               "with the asserted permission.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}", e);
         }
      }

      public static void TestDenyAndLinkDemand()
      {
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect with " +
               "LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}",e);
         }
      }
         
      public static void Main()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,
            "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Deny();

         //Test Deny and Assert interaction for LinkDemands and Demands.
         TestAssertAndDeny();

         //Test Deny's effects on code in different stack frame. 
         TestDenyAndLinkDemand();

         //Test Deny's effect on code in same frame as deny.
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "This Deny has no effect with LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine("This Deny protected the library.{0}",e);
         }
      }
   }
}

В примере получается следующий вывод.

Demand: Caller's Deny has no effect on Demand with the asserted permission.
LinkDemand: Caller's Deny has no effect on LinkDemand with the asserted permission.
LinkDemand: Caller's Deny has no effect with LinkDemand-protected code.
LinkDemand: This Deny has no effect with LinkDemand-protected code.

См. также