Bagikan melalui


CA5362: Siklus referensi potensial dalam grafik objek yang dideserialisasi

Properti Nilai
ID Aturan CA5362
Judul Siklus referensi potensial dalam grafik objek yang dideserialisasi
Golongan Keamanan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Kelas yang ditandai dengan System.SerializableAttribute memiliki bidang atau properti dapat merujuk ke objek yang berisi secara langsung atau tidak langsung, memungkinkan siklus referensi potensial.

Deskripsi aturan

Jika mendeserialisasi data yang tidak tepercaya, maka kode apa pun yang memproses grafik objek yang dideserialisasi perlu menangani siklus referensi tanpa masuk ke perulangan tanpa batas. Ini mencakup kode yang merupakan bagian dari panggilan balik deserialisasi dan kode yang memproses grafik objek setelah deserialisasi selesai. Jika tidak, penyerang dapat melakukan Penolakan serangan Layanan dengan data berbahaya yang berisi siklus referensi.

Aturan ini tidak selalu berarti ada kerentanan, tetapi hanya menandai siklus referensi potensial dalam grafik objek yang dideserialisasi.

Cara memperbaiki pelanggaran

Jangan membuat serial kelas dan menghapus SerializableAttribute. Atau, desain ulang aplikasi Anda sehingga anggota yang dirujuk sendiri dapat dihapus dari kelas yang dapat diserialisasikan.

Kapan harus menekan peringatan

Aman untuk menyembunyikan peringatan dari aturan ini jika:

  • Anda mengetahui bahwa input-nya tepercaya. Pertimbangkan bahwa batas kepercayaan dan aliran data aplikasi Anda dapat berubah dari waktu ke waktu.
  • Semua kode yang memproses data yang dideserialisasi mendeteksi dan menangani siklus referensi tanpa masuk ke perulangan tak terbatas atau menggunakan sumber daya yang berlebihan.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh kode semu

Potensi pelanggaran siklus referensi

using System;

[Serializable()]
class ExampleClass
{
    public ExampleClass ExampleProperty {get; set;}

    public int NormalProperty {get; set;}
}

class AnotherClass
{
    // The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
    public void AnotherMethod(ExampleClass ec)
    {
        while(ec != null)
        {
            Console.WriteLine(ec.ToString());
            ec = ec.ExampleProperty;
        }
    }
}

Solusi

using System;

[Serializable()]
class ExampleClass
{
    [NonSerialized]
    public ExampleClass ExampleProperty {get; set;}

    public int NormalProperty {get; set;}
}

class AnotherClass
{
    // The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
    public void AnotherMethod(ExampleClass ec)
    {
        while(ec != null)
        {
            Console.WriteLine(ec.ToString());
            ec = ec.ExampleProperty;
        }
    }
}