CA2310: Não use o desserializador inseguro NetDataContractSerializer

Propriedade valor
ID da regra CA2310
Cargo Não use o desserializador inseguro NetDataContractSerializer
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Um System.Runtime.Serialization.NetDataContractSerializer método de desserialização foi chamado ou referenciado.

Descrição da regra

Desserializadores inseguros são vulneráveis ao desserializar dados não confiáveis. Um invasor pode modificar os dados serializados para incluir tipos inesperados para injetar objetos com efeitos colaterais mal-intencionados. Um ataque contra um desserializador inseguro pode, por exemplo, executar comandos no sistema operacional subjacente, se comunicar pela rede ou excluir arquivos.

Esta regra localiza System.Runtime.Serialization.NetDataContractSerializer chamadas ou referências de método de desserialização. Se você quiser desserializar somente quando a Binder propriedade estiver definida para restringir tipos, desative essa regra e habilite as regras CA2311 e CA2312 . Limitar quais tipos podem ser desserializados pode ajudar a mitigar ataques conhecidos de execução remota de código, mas sua desserialização ainda estará vulnerável a ataques de negação de serviço.

NetDataContractSerializer é insegura e não pode ser tornada segura. Para obter mais informações, consulte o guia de segurança BinaryFormatter.

Como corrigir violações

  • Em vez disso, use um serializador seguro e não permita que um invasor especifique um tipo arbitrário para desserializar. Para obter mais informações, consulte as alternativas preferidas.
  • Torne os dados serializados 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.
  • Essa opção torna o código vulnerável a ataques de negação de serviço e possíveis ataques de execução remota de código no futuro. Para obter mais informações, consulte o guia de segurança BinaryFormatter. Restrinja tipos desserializados. Implemente um arquivo System.Runtime.Serialization.SerializationBinder. Antes de desserializar, defina a Binder propriedade como uma instância do seu costume SerializationBinder em todos os caminhos de código. No método substituído BindToType , se o tipo for inesperado, lance uma exceção para interromper a desserialização.

Quando suprimir avisos

NetDataContractSerializer é insegura e não pode ser tornada segura.

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

CA2311: Não desserialize sem primeiro definir NetDataContractSerializer.Binder

CA2312: Verifique se NetDataContractSerializer.Binder está definido antes de desserializar