CA2300: Jangan gunakan deserializer yang tidak aman, BinaryFormatter

Properti Nilai
ID Aturan CA2300
Judul Jangan gunakan deserializer yang tidak aman, BinaryFormatter
Kategori Keamanan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Metode System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserialisasi dipanggil atau dirujuk.

Deskripsi aturan

Proses deserialisasi yang tidak aman rentan dalam konteks keamanan saat mendeserialisasi data yang tidak tepercaya. Penyerang dapat mengubah data yang diserialisasikan untuk memasukkan jenis tidak terduga untuk menyuntikkan objek dengan efek samping yang berbahaya. Serangan terhadap pendeserialisasi yang tidak aman dapat, misalnya, menjalankan perintah pada sistem operasi dasar, berkomunikasi melalui jaringan, atau menghapus file.

Aturan ini menemukan System.Runtime.Serialization.Formatters.Binary.BinaryFormatter panggilan atau referensi metode deserialisasi. Jika Anda hanya ingin mendeserialisasi saat Binder properti diatur untuk membatasi tipe, nonaktifkan aturan ini, dan aktifkan aturan CA2301 dan CA2302 sebagai alternatif. Membatasi jenis mana yang dapat dideserialisasi dapat membantu mengurangi serangan eksekusi kode jarak jauh yang diketahui, tetapi deserialisasi Anda masih akan rentan terhadap penolakan serangan layanan.

BinaryFormatter tidak aman dan tidak dapat dibuat aman. Untuk informasi selengkapnya, lihat panduan keamanan BinaryFormatter.

Cara memperbaiki pelanggaran

  • Gunakan serializer yang aman sebagai gantinya, dan jangan izinkan penyerang menentukan tipe sembarangan ketika mendeserialisasi. Untuk informasi selengkapnya, lihat Alternatif pilihan.
  • Buat data yang diserialisasi agar tahan rusak. Setelah serialisasi, tanda tangani secara kriptografi data yang diserialisasi. Sebelum deserialisasi, validasi tanda tangan kriptografi. Lindungi kunci kriptografi agar tidak diungkapkan dan didesain untuk rotasi kunci.
  • Opsi ini membuat kode rentan terhadap penolakan serangan layanan dan kemungkinan serangan eksekusi kode jarak jauh di masa depan. Untuk informasi selengkapnya, lihat panduan keamanan BinaryFormatter. Batasi jenis yang dideserialisasi. Terapkan System.Runtime.Serialization.SerializationBinder khusus. Sebelum melakukan deserialisasi, atur properti Binder ke instans kustom SerializationBinder Anda dalam semua jalur kode. Dalam metode yang ditimpa BindToType, jika jenisnya tidak terduga, lemparkan pengecualian untuk menghentikan deserialisasi.

Kapan harus menekan peringatan

BinaryFormatter tidak aman dan tidak dapat dibuat aman.

Contoh kode semu

Pelanggaran

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: Jangan panggil BinaryFormatter.Deserialize tanpa terlebih dahulu mengatur BinaryFormatter.Binder

CA2302: Pastikan BinaryFormatter.Binder diatur sebelum memanggil BinaryFormatter.Deserialize