CA2315: Não usar o desserializador inseguro ObjectStateFormatter
Property | Valor |
---|---|
ID da regra | CA2315 |
Título | Não usar o desserializador inseguro ObjectStateFormatter |
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.Web.UI.ObjectStateFormatter 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 de método de desserialização System.Web.UI.ObjectStateFormatter.
Como corrigir violações
Se possível, use um serializador seguro e não permita que um invasor especifique um tipo arbitrário para desserializar. Alguns serializadores mais seguros incluem:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer - Nunca use System.Web.Script.Serialization.SimpleTypeResolver. Se você precisar usar um resolvedor de tipo, restrinja os tipos desserializados a uma lista esperada.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET - Usar TypeNameHandling.None. Se você precisar usar outro valor para TypeNameHandling, restrinja os tipos desserializados a uma lista esperada com um ISerializationBinder personalizado.
- Buffers de protocolo
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 projete rotações de chave.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se:
- Você souber que a entrada é confiável. Considere que o limite de confiança do seu aplicativo e os fluxos de dados podem ser alterados ao longo do tempo.
- Você tiver tomado uma das precauções descritas em Como corrigir violações.
Exemplos de pseudocódigo
Violação
using System.IO;
using System.Web.UI;
public class ExampleClass
{
public object MyDeserialize(byte[] bytes)
{
ObjectStateFormatter formatter = new ObjectStateFormatter();
return formatter.Deserialize(new MemoryStream(bytes));
}
}
Imports System.IO
Imports System.Web.UI
Public Class ExampleClass
Public Function MyDeserialize(bytes As Byte()) As Object
Dim formatter As ObjectStateFormatter = New ObjectStateFormatter()
Return formatter.Deserialize(New MemoryStream(bytes))
End Function
End Class