CA2315: Não use o desserializador inseguro ObjectStateFormatter
Property | valor |
---|---|
ID da regra | CA2315 |
Título | Não use o desserializador inseguro ObjectStateFormatter |
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.Web.UI.ObjectStateFormatter 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.Web.UI.ObjectStateFormatter chamadas ou referências de método de desserialização.
Como corrigir violações
Se possível, use um serializador seguro em vez disso 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 tipos, restrinja os tipos desserializados a uma lista esperada.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET - Use TypeNameHandling.None. Se você precisar usar outro valor para TypeNameHandling, restrinja os tipos desserializados a uma lista esperada com um ISerializationBinder personalizado.
- Memória Intermédia do Protocolo
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.
Quando suprimir avisos
É seguro suprimir um aviso desta regra se:
- Você sabe que a entrada é confiável. Considere que o limite de confiança e os fluxos de dados do seu aplicativo podem mudar ao longo do tempo.
- Você tomou uma das precauções 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