CA2153: Evitare di gestire eccezioni di stato danneggiate
Proprietà | valore |
---|---|
ID regola | CA2153 |
Title | Evitare la gestione delle eccezioni stato danneggiato |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Le eccezioni di stato danneggiate indicano che il danneggiamento della memoria esiste nel processo. Se si prova a intercettare tali eccezioni, invece di lasciare che il processo venga arrestato in modo anomalo, può portare a vulnerabilità di sicurezza nel caso in cui un utente malintenzionato riesca a inserire un exploit nell'area della memoria danneggiata.
Descrizione regola
CSE indica che lo stato di un processo è stato danneggiato e non è stato recuperato dal sistema. Nello scenario dello stato danneggiato, un gestore generale intercetta l'eccezione solo se si contrassegna il metodo con l'attributo System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute . Per impostazione predefinita, Common Language Runtime (CLR) non richiama i gestori catch per i CSP.
L'opzione più sicura consiste nel consentire al processo di arrestarsi in modo anomalo senza intercettare questi tipi di eccezioni. Anche il codice di registrazione può consentire agli utenti malintenzionati di sfruttare i bug di danneggiamento della memoria.
Questo avviso viene attivato quando si intercettano cses con un gestore generale che intercetta tutte le eccezioni, ad esempio catch (System.Exception e)
o catch
senza parametri di eccezione.
Come correggere le violazioni
Per risolvere questo avviso, eseguire una delle operazioni seguenti:
Rimuovere l'attributo HandleProcessCorruptedStateExceptionsAttribute. In questo modo viene ripristinato il comportamento di runtime predefinito in cui i CSP non vengono passati ai gestori catch.
Rimuovere il gestore catch generale nella preferenza dei gestori che recuperano tipi di eccezione specifici. Ciò può includere cses, presupponendo che il codice del gestore possa gestirli in modo sicuro (raro).
Rigenerare il cse nel gestore catch, che passa l'eccezione al chiamante e dovrebbe comportare la fine del processo in esecuzione.
Quando eliminare gli avvisi
Non escludere un avviso da questa regola.
Esempio di pseudo-codice
Violazione
Lo pseudocodice seguente illustra il modello rilevato da questa regola.
[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Soluzione 1: rimuovere l'attributo
La rimozione dell'attributo HandleProcessCorruptedStateExceptionsAttribute garantisce che le eccezioni dello stato danneggiato non vengano gestite dal metodo .
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Soluzione 2: rilevare eccezioni specifiche
Rimuovere il gestore catch generale e recuperare solo tipi specifici di eccezioni.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (IOException e)
{
// Handle IOException.
}
catch (UnauthorizedAccessException e)
{
// Handle UnauthorizedAccessException.
}
}
Soluzione 3 - rethrow
Rigenerare l'eccezione.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}