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


CA2108: проверьте объявляемые параметры безопасности типов значений

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

Категория

Microsoft.Security

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

Не критическое

Причина

Открытый или защищенный тип значения защищен проверкой Данные и модели в .NET Framework или Требования связывания.

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

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

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

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

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

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

Пример

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

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

[assembly:AllowPartiallyTrustedCallers]  

namespace SecurityRulesLibrary
{
   // Violates rule: ReviewDeclarativeSecurityOnValueTypes.
   [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]

   public struct SecuredTypeStructure 
   {
      internal double xValue;
      internal double yValue;

      public SecuredTypeStructure(double x, double y) 
      {
         xValue = x;
         yValue = y;
         Console.WriteLine("Creating an instance of SecuredTypeStructure.");
      }     
      public override string ToString()
      {
         return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
      }
   }

   public class StructureManager
   {
      // This method asserts trust, incorrectly assuming that the caller must have  
      // permission because they passed in instance of the value type.
      [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]

      public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
      {
         aStructure.xValue += 100;
         aStructure.yValue += 100;
         Console.WriteLine ("New values {0}", aStructure.ToString());
         return aStructure;
      }
   }
}

В следующем приложении демонстрируется уязвимость библиотеки.

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;

// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, 
   Name="FullTrust")]

namespace TestSecurityExamples
{
   public class TestDemandOnValueType
   {
      static SecuredTypeStructure mystruct;

      [STAThread]
      public static void Main() 
      {
         try
         {
            mystruct = new SecuredTypeStructure(10,10);

         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure custom constructor: {0}", e.Message);
         }

         // The call to the default constructor  
         // does not throw an exception. 
         try 
         {
            mystruct = StructureManager.AddStepValue(
               new SecuredTypeStructure());
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure default constructor: {0}", e.Message);
         }

         try 
         {
            StructureManager.AddStepValue(mystruct);
         } 

         catch (Exception e)
         {  
            Console.WriteLine(
               "StructureManager add step: {0}", e.Message);
         }
      }
   }
}

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

  

См. также

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

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

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

Данные и модели в .NET Framework