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


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