CA2153: Evitare di gestire eccezioni di stato danneggiate

Proprietà valore
ID regola CA2153
Titolo Evitare la gestione delle eccezioni stato danneggiato
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Le eccezioni di stato danneggiate (C edizione Standard s) 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 C edizione Standard s.

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 intercetta C edizione Standard con un gestore generale che intercetta tutte le eccezioni, catch (System.Exception e) ad esempio 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 edizione Standard non vengono passati ai gestori catch.

  • Rimuovere il gestore catch generale nella preferenza dei gestori che recuperano tipi di eccezione specifici. Ciò può includere C edizione Standard, presupponendo che il codice del gestore possa gestirli in modo sicuro (raro).

  • Rigenerare il C edizione Standard 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;
    }
}