CA2315: Jangan gunakan ObjectStateFormatter pendeserialisasi yang tidak aman
Properti | Nilai |
---|---|
ID Aturan | CA2315 |
Judul | Jangan gunakan deserializer ObjectStateFormatter yang tidak aman |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Metode System.Web.UI.ObjectStateFormatter deserialisasi dipanggil atau dirujuk.
Deskripsi aturan
Pendeserialisasi yang tidak aman rentan 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.Web.UI.ObjectStateFormatter panggilan atau referensi metode deserialisasi.
Cara memperbaiki pelanggaran
Jika memungkinkan, gunakan serializer aman sebagai gantinya, dan jangan izinkan penyerang menentukan jenis arbitrer untuk mendeserialisasi. Beberapa serializer yang lebih aman meliputi:
- System.Runtime.Serialization.DataContractSerializer
- System.Runtime.Serialization.Json.DataContractJsonSerializer
- System.Web.Script.Serialization.JavaScriptSerializer - Jangan pernah menggunakan System.Web.Script.Serialization.SimpleTypeResolver. Jika Anda harus menggunakan pemecah masalah jenis, batasi jenis deserialisasi ke daftar yang diharapkan.
- System.Xml.Serialization.XmlSerializer
- Newtonsoft Json.NET - Gunakan TypeNameHandling.None. Jika Anda harus menggunakan nilai lain untuk TypeNameHandling, batasi jenis deserialisasi ke daftar yang diharapkan dengan ISerializationBinder kustom.
- Buffer Protokol
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.
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.
- Anda telah mengambil salah satu tindakan pencegahan dalam Cara memperbaiki pelanggaran.
Contoh kode semu
Pelanggaran
using System.IO;
using System.Web.UI;
public class ExampleClass
{
public object MyDeserialize(byte[] bytes)
{
ObjectStateFormatter formatter = new ObjectStateFormatter();
return formatter.Deserialize(new MemoryStream(bytes));
}
}
Imports System.IO
Imports System.Web.UI
Public Class ExampleClass
Public Function MyDeserialize(bytes As Byte()) As Object
Dim formatter As ObjectStateFormatter = New ObjectStateFormatter()
Return formatter.Deserialize(New MemoryStream(bytes))
End Function
End Class