CA2124:在外部 try 块中包装易受攻击的 finally 子句

类型名

WrapVulnerableFinallyClausesInOuterTry

CheckId

CA2124

类别

Microsoft.Security

是否重大更改

原因

在 1.0 和 1.1 版的 .NET Framework 中,公共或受保护的方法包含 try/catch/finally 数据块。 该 finally 块似乎要重置安全性状态,并且没有包括在 finally 块中。

规则说明

此规则定位面向 1.0 和 1.1 版的 .NET Framework 的代码中的 try/finally 块,这些块可能容易被调用堆栈中出现的恶意异常筛选器攻击。 如果敏感操作(如模拟)出现在 try 块中,将引发异常,筛选器可以在 finally 块之前执行。 对于模拟示例,这意味着筛选器将作为被模拟用户执行。 筛选器当前只能在 Visual Basic 中实现。

警告

注意:在 2.0 版及更高版本的 .NET Framework 中,如果重置直接发生在包含异常数据块的方法内,运行时会自动保护 try/catch/ finally 数据块免遭恶意的异常筛选器攻击。

如何解决冲突

将未包装的 try/finally 放入外部 try 块中。 请参见后面的第二个示例。 这将强制 finally 在筛选器代码之前执行。

何时禁止显示警告

不要禁止显示此规则发出的警告。

伪代码示例

ms182322.collapse_all(zh-cn,VS.110).gif说明

下面的伪代码演示该规则检测的模式。

ms182322.collapse_all(zh-cn,VS.110).gif代码

try {
   // Do some work.
   Impersonator imp = new Impersonator("John Doe");
   imp.AddToCreditCardBalance(100);
}
finally {
   // Reset security state.
   imp.Revert();
}

示例

下面的伪代码演示可以用来保护代码并满足该规则的模式。

try {
     try {
        // Do some work.
     }
     finally {
        // Reset security state.
     }
}
catch()
{
    throw;
}