CA2153: Undvik att hantera skadade tillståndsundantag

Egenskap Värde
Regel-ID CA2153
Title Undvik att hantera undantag för skadat tillstånd
Kategori Säkerhet
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

Corrupted State Exceptions (CSE) indikerar att minneskorruption som 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 indikerar att tillståndet för en process har skadats och inte fångats av systemet. I det korrupta tillståndssceniariot fångar en generell hanterare bara undantaget om du markerar din metod med System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute attributet. Som standardinställning anropar inte Common Language Runtime (CLR) catch-hanterare för CSEer.

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 standardkörningsbeteendet där CSE:er inte skickas till catch-hanterare.

  • Ta bort den allmänna catch-hanteraren till förmån 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

Att ta bort HandleProcessCorruptedStateExceptionsAttribute-attributet säkerställer 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 generella 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 – omkasta

Kasta om undantaget.

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