CA2153:避免處理損毀狀態例外

屬性
規則識別碼 CA2153
職稱 避免處理損毀狀態例外
類別 安全性
修正是造成中斷還是不中斷 不中斷
在 .NET 10 中預設啟用
適用語言 C# 與 Visual Basic

原因

損毀狀態例外狀況 (CSE) 表示您的進程中存在記憶體損毀。 如果攻擊者能夠將漏洞放進損毀的記憶體區域,捕獲這些錯誤而不是讓程序崩潰可能會導致安全性弱點。

規則描述

CSE 指出處理序的狀態已損毀且未被系統察覺。 在損毀的狀態案例中,一般處理程式只會在將 方法標示為 System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute 屬性時攔截例外狀況。 根據預設, Common Language Runtime (CLR) 不會叫用 CSE 的 catch 處理程式。

最安全的做法是允許程序崩潰,而不攔截這類例外狀況。 即使是記錄程式代碼也可以讓攻擊者利用記憶體損毀錯誤。

此警告會在使用攔截所有例外狀況的一般處理程式來攔截 CSE 時觸發,例如, catch (System.Exception e)catch 沒有任何例外狀況參數。

如何修正違規

若要解決此警告,請執行下列其中一項:

  • 移除 HandleProcessCorruptedStateExceptionsAttribute 屬性。 這會回復到預設的執行時行為,即 CSE 不會傳遞給捕捉處理器。

  • 移除一般的 catch 處理常式,優先使用攔截特定例外狀況類型的處理常式。 這可能包括 CSE,假設處理程序代碼可以安全處理它們(罕見)。

  • 在 catch 處理程式中重新擲回 CSE,這樣會將異常傳遞給呼叫者,並可能導致程式的結束。

隱藏警告的時機

請勿隱藏此規則的警告。

虛擬程式碼範例

違規

下列虛擬程式碼會說明這個規則偵測到的模式。

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

解決方案 1 - 移除 屬性

拿掉 HandleProcessCorruptedStateExceptionsAttribute 屬性可確保方法不會處理損毀狀態例外狀況。

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

解決方案 2 - 攔截特定例外狀況

移除一般 catch 處理常式,只攔截特定的例外狀況類型。

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

解決方案 3 - 重新擲回

重新擲回例外狀況。

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