CA5362: Ciclo de referência potencial no gráfico de objeto desserializado

Propriedade valor
ID da regra CA5362
Cargo Ciclo de referência potencial no gráfico de objeto desserializado
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Uma classe marcada com o System.SerializableAttribute tem um campo ou propriedade pode referir-se ao objeto que contém direta ou indiretamente, permitindo um ciclo de referência potencial.

Descrição da regra

Se desserializar dados não confiáveis, qualquer código que processe o gráfico de objeto desserializado precisa lidar com ciclos de referência sem entrar em loops infinitos. Isso inclui o código que faz parte de um retorno de chamada de desserialização e o código que processa o gráfico de objeto após a conclusão da desserialização. Caso contrário, um invasor pode executar um ataque de negação de serviço com dados mal-intencionados contendo um ciclo de referência.

Essa regra não significa necessariamente que há uma vulnerabilidade, mas apenas sinaliza possíveis ciclos de referência em gráficos de objetos desserializados.

Como corrigir violações

Não serialize a classe e remova o SerializableAttributearquivo . Ou, redesenhe seu aplicativo para que os membros autorreferidos possam ser removidos da classe serializável.

Quando suprimir avisos

É seguro suprimir um aviso desta regra se:

  • Você sabe que a entrada é confiável. Considere que o limite de confiança e os fluxos de dados do seu aplicativo podem mudar ao longo do tempo.
  • Todo o processamento de código dos dados desserializados deteta e lida com ciclos de referência sem entrar em um loop infinito ou usar recursos excessivos.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Potencial violação do ciclo de referência

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

Solução

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