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


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 будет выполнен перед кодом фильтра.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример псевдокода

ms182322.collapse_all(ru-ru,VS.110).gifОписание

В следующем примере псевдокода показан шаблон, обнаруживаемый этим правилом.

ms182322.collapse_all(ru-ru,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;
}