Compartilhar via


CA2124: Disposição vulnerável finalmente cláusulas no exterior tente

TypeName

WrapVulnerableFinallyClausesInOuterTry

CheckId

CA2124

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Não separável

Causa

Nas versões 1.0 e 1.1 da .NET Framework, um método público ou protegido contém um try/catch/finally bloco.O finally bloco aparece para redefinir o estado de segurança e não está contido em um finally bloco.

Descrição da regra

Esta regra localiza try/finally blocos no código direcionado a versões 1.0 e 1.1 da .NET Framework que pode estar vulnerável a filtros de exceção mal-intencionado presentes na pilha de chamadas.Se as operações confidenciais, como representação ocorrem no bloco try, e uma exceção é lançada, o filtro pode executar antes o finally bloco.No exemplo de representação, isso significa que o filtro será executado como o usuário representado.Os filtros são implementação atualmente apenas em Visual Basic.

Observação de cuidadoCuidado

Nota nas versões 2.0 e versões posteriores do .NET Framework, o runtime protege automaticamente um try/catch/ finally bloqueados a partir de filtros de exceção mal-intencionados, se a reinicialização ocorrer diretamente no método que contém o bloco de exceção.

Como corrigir violações

Coloque o desfeita try/finally em um bloco try externo.Consulte o segundo exemplo que se segue.Isso força o finally para executar antes o código do filtro.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo de pseudocódigo

ms182322.collapse_all(pt-br,VS.110).gifDescrição

O pseudocódigo a seguir ilustra o padrão detectado por esta regra.

ms182322.collapse_all(pt-br,VS.110).gifCódigo

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

Exemplo

O pseudocódigo a seguir mostra o padrão que você pode usar para proteger seu código e satisfazem a esta regra.

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