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

屬性
規則識別碼 CA2153
標題 避免處理損毀狀態例外
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

損毀狀態例外狀況 (CSE) 表示您的進程中存在記憶體損毀。 如果攻擊者將攻擊放入損毀的記憶體區域,則攔截這些處理序而非讓它們損毀,會導致安全性弱點。

檔案描述

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

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

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

如何修正違規

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

  • 移除 HandleProcessCorruptedStateExceptionsAttribute 屬性。 這會還原為預設執行時間行為,其中 CSE 不會傳遞至 catch 處理常式。

  • 移除一般 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;
    }
}