Поделиться через


CA2124: помещайте уязвимые предложения finally во внешний блок try

TypeName

WrapVulnerableFinallyClausesInOuterTry

CheckId

CA2124

Категория

Microsoft.Security

Критическое изменение

Не критическое

Причина

В версиях 1.0 и 1.1 .NET Framework, открытый или защищенный метод содержит блок try/ catch/ finally. Блок finally сбрасывает состояние безопасности не заключен в блок finally.

Описание правила

Это правило находит блоки try/finally в коде, метящем версии 1.0 и 1.1 платформы .NET Framework, которые могут быть уязвимы для вредоносных фильтров исключений в стеке вызова. Если в блоке try происходят важные операции, такие как олицетворение, и возникает исключения, то фильтр может быть выполнен до блока finally. В случае с олицетворением фильтр будет выполнен от имени олицетворенного пользователя. В настоящее время фильтры можно реализовать только в Visual Basic.

Предупреждение

Примечание В версии 2.0 и более поздних версий .NET Framework, среда выполнения автоматически защищает блок try/ catch/ finally от вредоносных фильтров исключений, если происходит сброс непосредственно в методе, который содержит блок исключений.

Устранение нарушений

Поместите распакованный блок 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;
}