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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: a lo largo de 2024, eliminaremos gradualmente los problemas de GitHub como mecanismo de comentarios para el contenido y lo reemplazaremos por un nuevo sistema de comentarios. Para obtener más información, consulte:Enviar y ver comentarios de