Share via


CA2153: Undvik att hantera skadade tillståndsfel

Property Värde
Regel-ID CA2153
Rubrik Undvik att hantera undantag för skadat tillstånd
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Undantag för skadat tillstånd (CSE) indikerar att minnesskada finns i din process. Att fånga dessa i stället för att låta processen krascha kan leda till säkerhetsrisker om en angripare kan placera en exploatering i den skadade minnesregionen.

Regelbeskrivning

CSE anger att tillståndet för en process har skadats och inte fångats av systemet. I scenariot med skadat tillstånd fångar en allmän hanterare bara undantaget om du markerar din metod med System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute attributet . Som standard anropar INTE CLR (Common Language Runtime) catch-hanterare för CSE:er.

Det säkraste alternativet är att låta processen krascha utan att fånga den här typen av undantag. Även loggningskod kan göra det möjligt för angripare att utnyttja minnesskadade buggar.

Den här varningen utlöses när du fångar upp CSE:er med en allmän hanterare som fångar upp alla undantag, catch (System.Exception e) till exempel eller catch utan undantagsparameter.

Så här åtgärdar du överträdelser

Lös den här varningen genom att göra något av följande:

  • Ta bort attributet HandleProcessCorruptedStateExceptionsAttribute . Detta återgår till standardbeteendet för körning där CSE:er inte skickas till catch-hanterare.

  • Ta bort den allmänna catch-hanteraren i stället för hanterare som fångar specifika undantagstyper. Detta kan omfatta CSE:er, förutsatt att hanteringskoden kan hantera dem på ett säkert sätt (sällsynt).

  • Återväxa CSE i catch-hanteraren, vilket skickar undantaget till anroparen och bör resultera i att körningsprocessen avslutas.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Exempel på pseudokod

Kränkning

Följande pseudokod illustrerar det mönster som identifierats av den här regeln.

[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Lösning 1 – ta bort attributet

HandleProcessCorruptedStateExceptionsAttribute Om du tar bort attributet ser du till att undantag från skadade tillstånd inte hanteras av din metod.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Lösning 2 – fånga specifika undantag

Ta bort den allmänna catch-hanteraren och fånga endast specifika undantagstyper.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (IOException e)
    {
        // Handle IOException.
    }
    catch (UnauthorizedAccessException e)
    {
        // Handle UnauthorizedAccessException.
    }
}

Lösning 3 – återväxt

Återväxa undantaget.

[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Rethrow the exception.
        throw;
    }
}