CA2300: Não use o desserializador inseguro BinaryFormatter

Propriedade valor
ID da regra CA2300
Cargo Não use o desserializador inseguro BinaryFormatter
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.Formatters.Binary.BinaryFormatter 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.Formatters.Binary.BinaryFormatter 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 CA2301 e CA2302 . 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.

BinaryFormatter é 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

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

Exemplos de pseudocódigo

Violação

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        return formatter.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim formatter As BinaryFormatter = New BinaryFormatter()
        Return formatter.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2301: Não chame BinaryFormatter.Deserialize sem primeiro definir BinaryFormatter.Binder

CA2302: Verifique se BinaryFormatter.Binder está definido antes de chamar BinaryFormatter.Deserialize