CA2310: Jangan gunakan deserializer NetDataContractSerializer yang tidak aman

Properti Nilai
ID Aturan CA2310
Judul Jangan gunakan deserializer NetDataContractSerializer yang tidak aman
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.NetDataContractSerializer 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.NetDataContractSerializer panggilan atau referensi metode deserialisasi. Jika Anda hanya ingin mendeserialisasi saat Binder properti diatur untuk membatasi jenis, nonaktifkan aturan ini dan aktifkan aturan CA2311 dan CA2312 sebagai gantinya. 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.

NetDataContractSerializer 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

NetDataContractSerializer tidak aman dan tidak dapat dibuat aman.

Contoh kode semu

Pelanggaran

using System.IO;
using System.Runtime.Serialization;

public class ExampleClass
{
    public object MyDeserialize(byte[] bytes)
    {
        NetDataContractSerializer serializer = new NetDataContractSerializer();
        return serializer.Deserialize(new MemoryStream(bytes));
    }
}
Imports System.IO
Imports System.Runtime.Serialization

Public Class ExampleClass
    Public Function MyDeserialize(bytes As Byte()) As Object
        Dim serializer As NetDataContractSerializer = New NetDataContractSerializer()
        Return serializer.Deserialize(New MemoryStream(bytes))
    End Function
End Class

CA2311: Jangan mendeserialisasi tanpa terlebih dahulu mengatur NetDataContractSerializer.Binder

CA2312: Pastikan NetDataContractSerializer.Binder diatur sebelum deserialisasi