CA2153: Hindari menangani Pengecualian Status yang Rusak

Properti Nilai
ID Aturan CA2153
Judul Hindari menangani Pengecualian Status Yang Rusak
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

Pengecualian Status Rusak (CSEs) menunjukkan bahwa kerusakan memori ada dalam proses Anda. Menangkap ini daripada membiarkan proses mengalami crash dapat menyebabkan kerentanan keamanan jika penyerang dapat menempatkan eksploitasi ke wilayah memori yang rusak.

Deskripsi aturan

CSE menunjukkan bahwa status proses telah rusak dan tidak tertangkap oleh sistem. Dalam skenario keadaan korup, handler generik hanya menangkap pengecualian jika Anda menandai metode Anda dengan atribut System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute. Secara default, Common Language Runtime (CLR) tidak memanggil handler catch untuk CSEs.

Opsi paling aman adalah membiarkan proses mengalami kegagalan tanpa menangkap pengecualian semacam ini. Bahkan kode pengelogan dapat memungkinkan penyerang untuk mengeksploitasi bug kerusakan memori.

Peringatan ini muncul ketika menangani CSEs dengan penangan umum yang menangkap semua pengecualian, misalnya, catch (System.Exception e) atau catch tanpa parameter pengecualian.

Cara memperbaiki pelanggaran

Untuk mengatasi peringatan ini, lakukan salah satu hal berikut:

  • HandleProcessCorruptedStateExceptionsAttribute Hapus atribut . Ini kembali ke perilaku runtime default di mana CSEs tidak diteruskan untuk menangkap handler.

  • Hapus handler tangkapan umum dan utamakan handler yang menangkap jenis pengecualian tertentu. Ini mungkin termasuk CSE, dengan asumsi kode handler dapat menanganinya dengan aman (jarang).

  • Menumbuhkan kembali CSE di handler tangkapan, yang meneruskan pengecualian ke pemanggil dan akan mengakibatkan mengakhiri proses yang sedang berjalan.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini.

Contoh kode semu

Pelanggaran

Kode semu berikut mengilustrasikan pola yang terdeteksi oleh aturan ini.

[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Solusi 1 - hapus atribut

Dengan menghapus atribut HandleProcessCorruptedStateExceptionsAttribute, Anda menjamin bahwa Pengecualian Status Rusak tidak ditangani oleh metode Anda.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Solusi 2 - menangkap pengecualian tertentu

Hapus handler tangkapan umum dan tangkap hanya jenis pengecualian tertentu.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (IOException e)
    {
        // Handle IOException.
    }
    catch (UnauthorizedAccessException e)
    {
        // Handle UnauthorizedAccessException.
    }
}

Solusi 3 - lempar ulang

Lempar ulang pengecualian.

[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Rethrow the exception.
        throw;
    }
}