CA2153: Undvik att hantera skadade tillståndsfel
Property | Värde |
---|---|
Regel-ID | CA2153 |
Title | 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 9 | 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;
}
}