CA2310: Não usar o desserializador inseguro NetDataContractSerializer
Property | Valor |
---|---|
ID da regra | CA2310 |
Título | Não usar o desserializador inseguro NetDataContractSerializer |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
Um método de desserialização System.Runtime.Serialization.NetDataContractSerializer foi chamado ou referenciado.
Descrição da regra
Desserializadores não seguros são vulneráveis ao desserializar dados não confiáveis. Um invasor pode modificar os dados serializados visando incluir tipos inesperados para injetar objetos com efeitos colaterais mal-intencionados. Um ataque contra um desserializador não seguro poderia, por exemplo, executar comandos no sistema operacional subjacente, realizar comunicações pela rede ou excluir arquivos.
Essa regra localiza referências ou chamadas do método de desserialização System.Runtime.Serialization.NetDataContractSerializer. Para realizar a desserialização somente quando a propriedade Binder estiver definida para restringir tipos, desabilite essa regra e habilite as regras CA2311 e CA2312. Limitar quais tipos podem ser desserializados ajuda na atenuação de ataques de execução de código remoto conhecidos, mas a desserialização ainda estará vulnerável a ataques de negação de serviço.
NetDataContractSerializer
não é seguro e não pode ser transformado em seguro. Para saber mais, confira o Guia de segurança do BinaryFormatter.
Como corrigir violações
- Use um serializador seguro como alternativa e não permita que um invasor especifique um tipo arbitrário a ser desserializado. Para saber mais, confira as Alternativas preferenciais.
- Torne os dados serializados à prova de adulteração. Após a serialização, assine criptograficamente os dados serializados. Antes da desserialização, valide a assinatura criptográfica. Proteja a chave criptográfica para impedir que ela seja divulgada e faça o design tendo em mente as rotações de chave.
- Essa opção torna o código vulnerável a ataques de negação de serviço e possíveis ataques de execução de código remoto no futuro. Para saber mais, confira o Guia de segurança do BinaryFormatter. Restrinja tipos desserializados. Implementar um System.Runtime.Serialization.SerializationBinder personalizado. Antes de desserializar, defina a propriedade
Binder
como uma instância do SerializationBinder personalizado em todos os caminhos de código. No método substituído BindToType, se o tipo for inesperado, gere uma exceção para interromper a desserialização.
Quando suprimir avisos
NetDataContractSerializer
não é seguro e não pode ser transformado em seguro.
Exemplos de pseudocódigo
Violação
using System.IO;
using System.Runtime.Serialization;
public class ExampleClass
{
public object MyDeserialize(byte[] bytes)
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
return serializer.Deserialize(new MemoryStream(bytes));
}
}
Imports System.IO
Imports System.Runtime.Serialization
Public Class ExampleClass
Public Function MyDeserialize(bytes As Byte()) As Object
Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
Return serializer.Deserialize(New MemoryStream(bytes))
End Function
End Class
Regras relacionadas
CA2311: Não desserializar sem definir primeiro NetDataContractSerializer.Binder
CA2312: Verificar se NetDataContractSerializer.Binder foi definido antes de desserializar