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