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