CA5362: Ciclo de referencia potencial en gráfico de objetos deserializados
Propiedad | Value |
---|---|
Identificador de la regla | CA5362 |
Título | Ciclo de referencia potencial en gráfico de objetos deserializados |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
Una clase marcada con System.SerializableAttribute tiene un campo o una propiedad que puede hacer referencia directa o indirectamente al objeto contenedor, lo cual permite un ciclo de referencia potencial.
Descripción de la regla
Si se deserializan los datos que no son de confianza, el procesamiento de código del gráfico de objetos deserializados debe controlar los ciclos de referencia sin entrar en bucles infinitos. Esto incluye código que forma parte de una devolución de llamada de deserialización y código que procesa el gráfico de objetos una vez completada la deserialización. De otro modo, un atacante podría realizar un ataque por denegación de servicio con datos malintencionados que contuvieran un ciclo de referencia.
Esta regla no implica necesariamente que haya una vulnerabilidad, sino que simplemente marca los posibles ciclos de referencia en los gráficos de objetos deserializados.
Cómo corregir infracciones
No serialice la clase y elimine SerializableAttribute. O vuelva a diseñar la aplicación para que los miembros que se hacen referencia a sí mismos puedan eliminarse de la clase serializable.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla si:
- Sabe que la entrada es de confianza. Considera que el límite de confianza de la aplicación y los flujos de datos pueden cambiar con el tiempo.
- Todo el código que procesa los datos deserializados detecta y controla los ciclos de referencia sin entrar en un bucle infinito o usar demasiados recursos.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplos de pseudocódigo
Posible infracción del ciclo de referencia
using System;
[Serializable()]
class ExampleClass
{
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}
Solución
using System;
[Serializable()]
class ExampleClass
{
[NonSerialized]
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}