Compartilhar via


CA2108: Analisar segurança declarativa em tipos de valor

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Não separável

Causa

Um tipo de valor público ou protegido é protegido por um Dados e modelagem da.NET Framework ou Demandas de link.

Descrição da regra

Tipos de valor são alocados e inicializados por seus construtores padrão antes de executar a outros construtores.Se um tipo de valor é protegido por uma demanda ou LinkDemand e o chamador não tem permissões que satisfazem a verificação de segurança, qualquer construtor diferente o padrão falhará e será lançada uma exceção de segurança.O tipo de valor não é desalocado; ela é deixada no estado definido pelo seu construtor padrão.Não assuma que um chamador que transmite uma instância do tipo de valor tem permissão para criar ou acessar a instância.

Como corrigir violações

Você não pode corrigir uma violação desta regra, a menos que você remover a verificação de segurança do tipo e verificações de segurança de nível de método de uso em seu lugar.Observe que corrigir a violação dessa maneira não impedirá que os chamadores com permissões inadequadas Obtenha instâncias do tipo de valor.Você deve garantir que uma instância do tipo de valor, em seu estado padrão, não expõem informações confidenciais e não pode ser usada de maneira prejudicial.

Quando suprimir avisos

Você pode suprimir um aviso de que essa regra se qualquer chamador possa obter instâncias do tipo valor em seu estado padrão, sem que se apresentam uma ameaça à segurança.

Exemplo

O exemplo a seguir mostra uma biblioteca que contém um tipo de valor que viola essa regra.Observe que o StructureManager tipo assume que um chamador que transmite uma instância do tipo de valor tem permissão para criar ou acessar a instância.

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

O seguinte aplicativo demonstra a fraqueza da biblioteca.

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

O exemplo produz a seguinte saída.

  
  

Consulte também

Conceitos

Demandas de link

Outros recursos

Dados e modelagem da.NET Framework