CA5360: Não chamar métodos perigosos durante a desserialização
Property | Valor |
---|---|
ID da regra | CA5360 |
Título | Não chamar métodos perigosos durante a desserialização |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
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, podendo ser o retorno de chamada de desserialização:
- Marcado com System.Runtime.Serialization.OnDeserializingAttribute.
- Marcado com System.Runtime.Serialization.OnDeserializedAttribute.
- Implementando System.Runtime.Serialization.IDeserializationCallback.OnDeserialization.
- Implementando System.IDisposable.Dispose.
- É um destruidor.
Descrição da regra
A desserialização não segura é uma vulnerabilidade que ocorre quando dados não confiáveis são usados para abusar da lógica de um aplicativo, realizar um ataque DoS (negação de serviço) ou até mesmo executar códigos arbitrários após a desserialização. É muito provável que usuários mal-intencionados abusem desses recursos de desserialização quando o aplicativo está desserializando dados não confiáveis sob controle deles. Especificamente, a invocação de métodos perigosos no processo de desserialização. Ataques de desserialização não segura bem-sucedidos podem permitir que um invasor realize ataques DoS, bypasses de autenticação e execução de código remoto.
Como corrigir violações
Remova esses métodos perigosos de retornos de chamada de desserialização executados automaticamente. Chame métodos perigosos somente após validar a entrada.
Quando suprimir avisos
É seguro suprimir esta regra se:
- Você sabe que a entrada é confiável. Considerar que o limite de confiança do seu aplicativo e os fluxos de dados podem ser alterados 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 de criptografia para impedir que ela seja divulgada e projete rotações de chave.
- Os dados são validados como seguros para o aplicativo.
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 CA5360
// The code that's violating the rule is on this line.
#pragma warning restore CA5360
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.CA5360.severity = none
Para obter mais informações, confira 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);
}
}