Udostępnij za pośrednictwem


CA2300: Nie używaj niezabezpieczonego deserializatora BinaryFormatter

Właściwości Wartość
Identyfikator reguły CA2300
Tytuł Nie używaj niezabezpieczonego deserializatora BinaryFormatter
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Metoda System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializacji została wywołana lub odwołana.

Opis reguły

Niezabezpieczone deserializatory są podatne podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. Atak na niezabezpieczonego deserializatora może na przykład wykonywać polecenia w bazowym systemie operacyjnym, komunikować się za pośrednictwem sieci lub usuwać pliki.

Ta reguła znajduje System.Runtime.Serialization.Formatters.Binary.BinaryFormatter wywołania metody deserializacji lub referencje. Jeśli chcesz dokonać deserializacji tylko wtedy, gdy właściwość Binder jest ustawiona, aby ograniczać typy, wyłącz tę regułę i włącz reguły CA2301 i CA2302. Ograniczenie, które typy mogą być deserializowane, może pomóc wyeliminować znane ataki zdalnego wykonywania kodu, ale deserializacja nadal będzie podatna na ataki typu "odmowa usługi".

BinaryFormatter jest niezabezpieczony i nie można go zabezpieczyć. Aby uzyskać więcej informacji, zobacz Przewodnik po zabezpieczeniach BinaryFormatter.

Jak naprawić naruszenia

  • Zamiast tego użyj bezpiecznego serializatora i nie zezwalaj osobie atakującej na określenie dowolnego typu do deserializacji. Aby uzyskać więcej informacji, zobacz Preferowane alternatywy.
  • Spraw, aby zserializowane dane były odporne na manipulacje. Po serializacji kryptograficznie podpisz serializowane dane. Przed deserializacji zweryfikuj podpis kryptograficzny. Chroń klucz kryptograficzny przed ujawnieniem i zaprojektuj rotacje kluczy.
  • Ta opcja sprawia, że kod jest podatny na ataki typu "odmowa usługi" i możliwe ataki zdalnego wykonywania kodu w przyszłości. Aby uzyskać więcej informacji, zobacz Przewodnik po zabezpieczeniach BinaryFormatter. Ogranicz deserializowane typy. Zaimplementuj niestandardowy element System.Runtime.Serialization.SerializationBinder. Przed deserializacją ustaw Binder właściwość na niestandardowe wystąpienie SerializationBinder we wszystkich ścieżkach kodu. W metodzie przesłoniętej BindToType, jeśli typ jest nieoczekiwany, należy rzucić wyjątek, aby zatrzymać deserializację.

Kiedy pomijać ostrzeżenia

BinaryFormatter jest niezabezpieczony i nie można go zabezpieczyć.

Przykłady pseudokodu

Naruszenie

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: Nie wywołuj metody BinaryFormatter.Deserialize bez wcześniejszego ustawienia BinaryFormatter.Binder

CA2302: Upewnij się, że parametr BinaryFormatter.Binder został ustawiony przed wywołaniem metody BinaryFormatter.Deserialize