CA2300: Não use o desserializador inseguro BinaryFormatter
Property | valor |
---|---|
ID da regra | CA2300 |
Título | 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 9 | Não |
Motivo
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
Regras conexas
CA2301: Não chame BinaryFormatter.Deserialize sem primeiro definir BinaryFormatter.Binder