CA2315: No usar el deserializador no seguro ObjectStateFormatter
Propiedad | Value |
---|---|
Identificador de la regla | CA2315 |
Título | No usar el deserializador no seguro ObjectStateFormatter |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
Se llamó o se hizo referencia a un método de deserialización System.Web.UI.ObjectStateFormatter.
Descripción de la regla
Los deserializadores no seguros son vulnerables al deserializar datos que no son de confianza. Un atacante podría modificar los datos serializados para incluir tipos inesperados a fin de insertar objetos con efectos secundarios malintencionados. Un ataque contra un deserializador inseguro podría, por ejemplo, ejecutar comandos en el sistema operativo subyacente, comunicarse a través de la red o eliminar archivos.
Esta regla busca referencias o llamadas al método de deserialización System.Web.UI.ObjectStateFormatter.
Cómo corregir infracciones
Si es posible, use un serializador seguro y no permita que un atacante especifique un tipo arbitrario para deserializar. Algunos serializadores más seguros incluyen lo siguiente:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer: no usar System.Web.Script.Serialization.SimpleTypeResolver nunca. Si tiene que usar un solucionador de tipos, restrinja los tipos deserializados a una lista de valores esperados.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET: use TypeNameHandling.None. Si tiene que usar otro valor para TypeNameHandling, restrinja los tipos deserializados a una lista de valores esperados con una interfaz ISerializationBinder personalizada.
- Búferes de protocolo
Proteja los datos serializados contra alteraciones. Después de la serialización, firme criptográficamente los datos serializados. Antes de la deserialización, valide la firma criptográfica. Proteja la clave criptográfica para que no se revele y diseñe las rotaciones de clave.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla si:
- Sabe que la entrada es de confianza. Considera que el límite de confianza de la aplicación y los flujos de datos pueden cambiar con el tiempo.
- Ha tomado una de las precauciones indicadas en Cómo corregir infracciones.
Ejemplos de pseudocódigo
Infracción
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