CA2153:避免處理損毀狀態例外
屬性 | 值 |
---|---|
規則識別碼 | CA2153 |
職稱 | 避免處理損毀狀態例外 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 9 中啟用 | 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;
}
}