Compartilhar via


CA5362: Ciclo de referência potencial no grafo de objetos desserializado

Property Valor
ID da regra CA5362
Título Ciclo de referência potencial no grafo de objetos desserializado
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

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

Descrição da regra

Ao desserializar dados não confiáveis, qualquer código que processe o grafo de objetos desserializado precisará lidar com ciclos de referência sem entrar em loops infinitos. Isso inclui tanto o código que faz parte de um retorno de chamada de desserialização quanto aquele que processa o grafo de objetos após a conclusão da desserialização. Caso contrário, um invasor poderia executar um ataque de negação de serviço com dados mal-intencionados que contêm um ciclo de referência.

Essa regra não significa necessariamente que exista uma vulnerabilidade, ela apenas sinaliza potenciais ciclos de referência em grafos de objeto desserializados.

Como corrigir violações

Não serialize a classe e remova o SerializableAttribute. Ou então, reprojete seu aplicativo para que os membros autorreferenciados possam ser removidos da classe serializável.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se:

  • Você souber que a entrada é confiável. Considere que os fluxos de dados e o limite de confiança do seu aplicativo podem ser alterados ao longo do tempo.
  • Todo o código que processa os dados desserializados detecta e manipula ciclos de referência sem entrar em um loop infinito ou usar recursos excessivos.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira 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;
        }
    }
}