CA2300: Nepoužívejte nezabezpečený deserializátor BinaryFormatter

Vlastnost Hodnota
ID pravidla CA2300
Název Nepoužívat nezabezpečený deserializátor BinaryFormatter
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Metoda System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializace byla volána nebo odkazována.

Popis pravidla

Nezabezpečené deserializátory jsou zranitelné při deserializaci nedůvěryhodných dat. Útočník by mohl serializovaná data upravit tak, aby zahrnovala neočekávané typy pro vložení objektů se škodlivými vedlejšími účinky. Útok na nezabezpečený deserializátor může například spouštět příkazy v podkladovém operačním systému, komunikovat přes síť nebo odstraňovat soubory.

Toto pravidlo najde System.Runtime.Serialization.Formatters.Binary.BinaryFormatter volání nebo odkazy metody deserializace. Pokud chcete deserializovat pouze v případě, že je vlastnost určena k omezení typů, toto pravidlo zakažte a namísto toho povolte pravidla CA2301 a CA2302. Omezení typů, které je možné deserializovat, může pomoct zmírnit proti známým útokům vzdáleného spuštění kódu, ale vaše deserializace bude stále zranitelná vůči útokům na dostupnost služby.

BinaryFormatter je nezabezpečený a nedá se zabezpečit. Další informace naleznete v příručce zabezpečení BinaryFormatter.

Jak opravit porušení

  • Místo toho použijte zabezpečený serializátor a nepovolte útočníkovi zadat libovolný typ deserializace. Další informace najdete v upřednostňovaných alternativách.
  • Zabezpečte serializovaná data proti neoprávněné manipulaci. Po serializaci kryptograficky podepisujte serializovaná data. Před deserializací ověřte kryptografický podpis. Chraňte kryptografický klíč před zveřejněním a navrhněte obměny klíčů.
  • Díky této možnosti je kód v budoucnu zranitelný vůči útokům na dostupnost služby a možným útokům vzdáleného spuštění kódu. Další informace naleznete v příručce zabezpečení BinaryFormatter. Omezit deserializované typy Implementovat vlastní System.Runtime.Serialization.SerializationBinder. Před deserializací nastavte Binder vlastnost na instanci svého vlastního SerializationBinder ve všech možných větvích kódu. V přepsané metodě BindToType, je-li typ neočekávaný, vyvolejte výjimku pro zastavení deserializace.

Kdy potlačit upozornění

BinaryFormatter je nezabezpečený a nedá se zabezpečit.

Příklady pseudokódu

Porušení

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: Nevolejte BinaryFormatter.Deserialize bez prvního nastavení BinaryFormatter.Binder

CA2302: Před voláním BinaryFormatter.Deserialize se ujistěte, že je nastaven binaryFormatter.Binder