CA2153: Bozuk Durum Özel Durumlarını işlemekten kaçının

Özellik Değer
Kural Kimliği CA2153
Başlık Bozuk Durum Özel Durumlarını işlemekten kaçının
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

Bozuk Durum Özel Durumları (CSE) işleminizde bellek bozulması olduğunu gösterir. İşlemin kilitlenmesine izin vermek yerine bunları yakalamak, bir saldırganın bozuk bellek bölgesine bir açık oluşturabilmesi durumunda güvenlik açıklarına yol açabilir.

Kural açıklaması

CSE, bir işlemin durumunun bozuk olduğunu ve sistem tarafından yakalanmadığını gösterir. Bozuk durum senaryosunda, genel işleyici yalnızca yönteminizi özniteliğiyle System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute işaretlerseniz özel durumu yakalar. Varsayılan olarak, Ortak Dil Çalışma Zamanı (CLR), CSE'ler için yakalama işleyicilerini çağırmaz.

En güvenli seçenek, bu tür özel durumları yakalamadan işlemin kilitlenmesine izin vermektir. Günlük kodu bile saldırganların bellek bozulması hatalarından yararlanmasına izin verebilir.

Bu uyarı, örneğin catch (System.Exception e) tüm özel durumları yakalayan genel bir işleyiciyle veya catch özel durum parametresi olmadan CSE'leri yakalarken tetiklenir.

İhlalleri düzeltme

Bu uyarıyı çözmek için aşağıdakilerden birini yapın:

  • özniteliğini HandleProcessCorruptedStateExceptionsAttribute kaldırın. Bu, CSE'lerin işleyicileri yakalamak için geçirilmediği varsayılan çalışma zamanı davranışına geri döner.

  • Belirli özel durum türlerini yakalayan işleyiciler tercihinde genel catch işleyicisini kaldırın. İşleyici kodunun bunları güvenli bir şekilde işleyebildiği varsayılarak (nadir) BU, CSE'leri içerebilir.

  • Özel durumu çağırana geçiren ve çalışan işlemin sona ermesi gereken catch işleyicisinde CSE'yi yeniden oluşturun.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan uyarıyı bastırmayın.

Sahte kod örneği

Ihlal

Aşağıdaki sahte kod, bu kural tarafından algılanan deseni gösterir.

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

Çözüm 1 - özniteliğini kaldırma

özniteliğinin HandleProcessCorruptedStateExceptionsAttribute kaldırılması, Bozuk Durum Özel Durumlarının yönteminiz tarafından işlenmemesini sağlar.

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

Çözüm 2 - belirli özel durumları yakalama

Genel catch işleyicisini kaldırın ve yalnızca belirli özel durum türlerini yakalayın.

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

Çözüm 3 - yeniden çatır

Özel durumu yeniden oluştur.

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