CA2300: Non usare un deserializzatore non sicuro BinaryFormatter

Proprietà valore
ID regola CA2300
Titolo Non usare il deserializzatore non sicuro BinaryFormatter
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

È stato chiamato o fatto riferimento a un System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 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.Runtime.Serialization.Formatters.Binary.BinaryFormatter chiamate o riferimenti al metodo di deserializzazione. Se si vuole deserializzare solo quando la Binder proprietà è impostata per limitare i tipi, disabilitare questa regola e abilitare le regole CA2301 e CA2302 . La limitazione dei tipi che possono essere deserializzati può contribuire a mitigare gli attacchi noti di esecuzione del codice remoto, ma la deserializzazione sarà comunque vulnerabile agli attacchi Denial of Service.

BinaryFormatter non è sicuro e non può essere reso sicuro. Per altre informazioni, vedere la Guida alla sicurezza di BinaryFormatter.

Come correggere le violazioni

  • Usare invece un serializzatore sicuro e non consentire a un utente malintenzionato di specificare un tipo arbitrario da deserializzare. Per altre informazioni, vedere Alternative preferite.
  • 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.
  • Questa opzione rende il codice vulnerabile agli attacchi Denial of Service e ai possibili attacchi di esecuzione del codice remoto in futuro. Per altre informazioni, vedere la Guida alla sicurezza di BinaryFormatter. Limitare i tipi deserializzati. Implementare un oggetto personalizzato System.Runtime.Serialization.SerializationBinder. Prima di deserializzare, impostare la proprietà su un'istanza Binder del personalizzato SerializationBinder in tutti i percorsi di codice. Nel metodo sottoposto BindToType a override, se il tipo è imprevisto, generare un'eccezione per arrestare la deserializzazione.

Quando eliminare gli avvisi

BinaryFormatter non è sicuro e non può essere reso sicuro.

Esempi di pseudo-codice

Violazione

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

CA2301: Non chiamare BinaryFormatter.Deserialize senza prima impostare BinaryFormatter.Binder

CA2302: Assicurarsi che BinaryFormatter.Binder sia impostato prima di chiamare BinaryFormatter.Deserialize