| 屬性 | 值 |
|---|---|
| 規則識別碼 | 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;
}
}