CA2124: Eseguire il wrapping delle clausole finally vulnerabili in un try esterno
TypeName |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
Category |
Microsoft.Security |
Breaking Change |
Non sostanziale |
Causa
Nelle versioni 1.0 e 1.1 di .NET Framework, in un metodo pubblico o protetto è incluso un blocco try/catch/finally. In apparenza il blocco finally reimposta lo stato di sicurezza e non è incluso in un blocco finally.
Descrizione della regola
La regola individua i blocchi try/finally nel codice destinato alle versioni 1.0 e 1.1 di .NET Framework che potrebbero essere vulnerabili a filtri di eccezione dannosi presenti nello stack di chiamate. Se nel blocco try vengono eseguite operazioni quali la rappresentazione e viene generata un'eccezione, il filtro può essere eseguito prima del blocco finally. Nell'esempio della rappresentazione, il filtro verrebbe eseguito come l'utente rappresentato. I filtri sono attualmente implementabili solo in Visual Basic.
Attenzione |
---|
Nota Nelle versioni 2.0 e successive di .NET Framework, il runtime consente di proteggere automaticamente un blocco try/catch/finally dai filtri di eccezioni dannosi, se si verifica la reimpostazione direttamente all'interno del metodo contenente il blocco di eccezioni. |
Come correggere le violazioni
Inserire il blocco try/finally privo di wrapper in un blocco try esterno. Vedere il secondo esempio riportato di seguito in cui viene forzata l'esecuzione del blocco finally prima del codice di filtro.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio di pseudo-codice
Oggetto di descrizione
Nello pseudo-codice riportato di seguito viene illustrato il modello rilevato da questa regola.
Codice
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
Esempio
Nello pseudo-codice riportato di seguito viene illustrato il modello che è possibile utilizzare per proteggere il codice e soddisfare questa regola.
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}