CA2108: Revisar la seguridad declarativa en los tipos de valores

Elemento Valor
RuleId CA2108
Category Microsoft.Security
Cambio importante Poco problemático

Causa

Un tipo de valor público o protegido está protegido mediante datos y modelado o peticiones de vínculos.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Los tipos de valor se asignan e inicializan mediante sus constructores predeterminados antes de que se ejecuten otros constructores. Si un tipo de valor está protegido mediante un elemento Demand o LinkDemand y el autor de llamada no tiene permisos que cumplan la comprobación de seguridad, se producirá un error en todos los constructores menos el predeterminado y se generará una excepción de seguridad. El tipo de valor no se desasigna, sino que se deja en el estado establecido por su constructor predeterminado. No dé por supuesto que los autores de llamada que pasen una instancia del tipo de valor tendrán permiso para crear la instancia o acceder a ella.

Cómo corregir infracciones

No podrá corregir una infracción de esta regla a menos que quite la comprobación de seguridad del tipo y use en su lugar comprobaciones de seguridad de nivel de método. El hecho de corregir la infracción de esta manera no impide que autores de llamada con permisos inadecuados obtengan instancias del tipo de valor. Debe asegurarse de que una instancia del tipo de valor en su estado predeterminado no exponga información confidencial y no se pueda usar de forma perjudicial.

Cuándo suprimir las advertencias

Puede suprimir una advertencia de esta regla si algún autor de llamada puede obtener instancias del tipo de valor en su estado predeterminado sin que ello suponga una amenaza para la seguridad.

Ejemplo 1

En el ejemplo siguiente se muestra una biblioteca que contiene un tipo de valor que infringe esta regla. El tipo StructureManager da por supuesto que los autores de llamada que pasen una instancia del tipo de valor tendrán permiso para crear la instancia o acceder a ella.

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

Ejemplo 2

En la aplicación siguiente se muestra el punto débil de la 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);
         }
      }
   }
}

Este ejemplo produce el siguiente resultado:

Structure custom constructor: Request failed.
New values SecuredTypeStructure 100 100
New values SecuredTypeStructure 200 200

Consulte también