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