| 属性 | 值 |
|---|---|
| 规则 ID | CA2153 |
| 标题 | 避免处理损坏状态异常 |
| 类别 | 安全性 |
| 修复是导致破坏性更改还是非破坏性更改 | 非中断 |
| 在 .NET 10 中默认启用 | 否 |
| 适用的语言 | C# 和 Visual Basic |
原因
损坏状态异常 (CSE) 指示进程中存在内存损坏。 如果攻击者可以将攻击放置到损坏的内存区域,则捕获它们(而非允许进程崩溃)可能导致安全漏洞。
规则说明
CSE 指示进程状态已损坏且未被系统捕获。 在损坏状态的情况下,仅当你使用 System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute 特性标记方法时,常规处理程序才会捕获异常。 默认情况下,公共语言运行时 (CLR) 不会为 CSE 调用 catch 处理程序。
最安全的选项是允许进程发生故障而不捕获这些类型的异常。 即使日志记录代码也可以使攻击者利用内存破坏漏洞。
当使用捕获所有异常的常规处理程序(例如,没有异常参数的 catch (System.Exception e) 或 catch)捕获 CSE 时,将触发此警告。
如何解决违规
若要解决此警告,请执行以下其中一项操作:
请删除 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;
}
}