CA2315: Non usare objectStateFormatter deserializer non sicuro
Proprietà | valore |
---|---|
ID regola | CA2315 |
Title | Non usare il deserializzatore non sicuro ObjectStateFormatter |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
È stato chiamato o fatto riferimento a un System.Web.UI.ObjectStateFormatter metodo di deserializzazione.
Descrizione regola
I deserializzatori non sicuri sono vulnerabili durante la deserializzazione dei dati non attendibili. Un utente malintenzionato potrebbe modificare i dati serializzati in modo da includere tipi imprevisti per inserire oggetti con effetti collaterali dannosi. Un attacco a un deserializzatore non sicuro potrebbe, ad esempio, eseguire comandi nel sistema operativo sottostante, comunicare in rete o eliminare file.
Questa regola trova System.Web.UI.ObjectStateFormatter chiamate o riferimenti al metodo di deserializzazione.
Come correggere le violazioni
Se possibile, usare invece un serializzatore sicuro e non consentire a un utente malintenzionato di specificare un tipo arbitrario da deserializzare. Alcuni serializzatori più sicuri includono:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer - Non usare System.Web.Script.Serialization.SimpleTypeResolvermai . Se è necessario usare un sistema di risoluzione dei tipi, limitare i tipi deserializzati a un elenco previsto.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET : usare TypeNameHandling.None. Se è necessario usare un altro valore per TypeNameHandling, limitare i tipi deserializzati a un elenco previsto con ISerializationBinder personalizzato.
- Buffer di protocollo
Rendere i dati serializzati a prova di manomissione. Dopo la serializzazione, firmare in modo crittografico i dati serializzati. Prima della deserializzazione, convalidare la firma crittografica. Proteggere la chiave crittografica dalla divulgazione e dalla progettazione per le rotazioni delle chiavi.
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola se:
- Si sa che l'input è attendibile. Si consideri che i limiti di attendibilità e i flussi di dati dell'applicazione possono cambiare nel tempo.
- È stata presa una delle precauzioni riportate in Come correggere le violazioni.
Esempi di pseudo-codice
Violazione
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