CA5360: Não chame métodos perigosos na desserialização
Propriedade | valor |
---|---|
ID da regra | CA5360 |
Cargo | Não chame métodos perigosos na desserialização |
Categoria | Segurança |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Não |
Causa
Chamando um dos seguintes métodos perigosos na desserialização:
- System.IO.Directory.Delete
- System.IO.DirectoryInfo.Delete
- System.IO.File.AppendAllLines
- System.IO.File.AppendAllText
- System.IO.File.AppendText
- System.IO.File.Copy
- System.IO.File.Delete
- System.IO.File.WriteAllBytes
- System.IO.File.WriteAllLines
- System.IO.File.WriteAllText
- System.IO.FileInfo.Delete
- System.IO.Log.LogStore.Delete
- System.Reflection.Assembly.GetLoadedModules
- System.Reflection.Assembly.Load
- System.Reflection.Assembly.LoadFrom
- System.Reflection.Assembly.LoadFile
- System.Reflection.Assembly.LoadModule
- System.Reflection.Assembly.LoadWithPartialName
- System.Reflection.Assembly.ReflectionOnlyLoad
- System.Reflection.Assembly.ReflectionOnlyLoadFrom
- System.Reflection.Assembly.UnsafeLoadFrom
Todos os métodos atendem a um dos seguintes requisitos podem ser o retorno de chamada da desserialização:
- Marcado com System.Runtime.Serialization.OnDeserializingAttribute.
- Marcado com System.Runtime.Serialization.OnDeserializedAttribute.
- Execução System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Execução System.IDisposable.Dispose.
- É um destruidor.
Descrição da regra
A desserialização insegura é uma vulnerabilidade que ocorre quando dados não confiáveis são usados para abusar da lógica de um aplicativo, infligir um ataque de negação de serviço (DoS) ou até mesmo executar código arbitrário ao ser desserializado. É frequentemente possível que usuários mal-intencionados abusem desses recursos de desserialização quando o aplicativo está desserializando dados não confiáveis que estão sob seu controle. Especificamente, invoque métodos perigosos no processo de desserialização. Ataques bem-sucedidos de desserialização insegura podem permitir que um invasor execute ataques como ataques DoS, desvios de autenticação e execução remota de código.
Como corrigir violações
Remova esses métodos perigosos de retornos de chamada de desserialização executados automaticamente. Chame métodos perigosos somente depois de validar a entrada.
Quando suprimir avisos
É seguro suprimir esta 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.
- Os dados serializados são invioláveis. Após a serialização, assine criptograficamente os dados serializados. Antes da desserialização, valide a assinatura criptográfica. Proteja a chave criptográfica de ser divulgada e projete rotações de chave.
- Os dados são validados como seguros para a aplicação.
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 CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5360.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Violação
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
File.Copy(sourceFileName, destFileName);
}
}
Solução
using System;
using System.IO;
using System.Runtime.Serialization;
[Serializable()]
public class ExampleClass : IDeserializationCallback
{
private string member;
void IDeserializationCallback.OnDeserialization(Object sender)
{
var sourceFileName = "malicious file";
var destFileName = "sensitive file";
// Remove the potential dangerous operation.
// File.Copy(sourceFileName, destFileName);
}
}