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

更新:2007 年 11 月

TypeName

WrapVulnerableFinallyClausesInOuterTry

CheckId

CA2124

类别

Microsoft.Security

是否重大更改

原因

公共方法或受保护方法包含 try/finally 块。该 finally 块似乎要重置安全性状态,并且没有包括在 finally 块中。

规则说明

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

如何修复冲突

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

何时禁止显示警告

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

伪代码示例

说明

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

代码

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;
}