Share via


CA2124: Eseguire il wrapping delle clausole finally vulnerabili in un try esterno

Articolo Valore
ID regola CA2124
Category Microsoft.Security
Modifica Nessuna interruzione

Causa

Nelle versioni 1.0 e 1.1 di .NET Framework un metodo pubblico o protetto contiene un try//catchfinally blocco. Il finally blocco sembra reimpostare lo stato di sicurezza e non è racchiuso in un finally blocco.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Questa regola individua i try/finally blocchi nel codice destinato alle versioni 1.0 e 1.1 di .NET Framework che potrebbero essere vulnerabili ai filtri eccezioni dannosi presenti nello stack di chiamate. Se si verificano operazioni sensibili come la rappresentazione nel blocco try e viene generata un'eccezione, il filtro può essere eseguito prima del finally blocco. Per l'esempio di rappresentazione, questo significa che il filtro viene eseguito come utente rappresentato. I filtri sono attualmente implementabili solo in Visual Basic.

Nota

Nelle versioni 2.0 e successive di .NET Framework, il runtime protegge automaticamente un try/ /catchfinally blocco da filtri eccezioni dannosi, se la reimpostazione viene eseguita direttamente all'interno del metodo che contiene il blocco di eccezioni.

Come correggere le violazioni

Posizionare l'oggetto non compresso try/finally in un blocco try esterno. Vedere il secondo esempio seguente. In questo modo l'oggetto deve essere eseguito prima del finally codice di filtro.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio di pseudo-codice

Descrizione

Lo pseudocodice seguente illustra il modello rilevato da questa regola.

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

Lo pseudo-codice seguente illustra il modello che è possibile usare per proteggere il codice e soddisfare questa regola.

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