CA2153: Vyhněte se zpracování výjimek poškozeného stavu
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2153 |
Název | Vyhněte se zpracování výjimek v poškozeném stavu |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Výjimky poškozeného stavu (CSE) označují, že v procesu existuje poškození paměti. Zachytávání těchto chyb místo toho, aby umožňovalo chybové ukončení procesu, může vést k ohrožením zabezpečení, pokud útočník může zneužití umístit do poškozené oblasti paměti.
Popis pravidla
CsE indikuje, že stav procesu je poškozen a systém ho nezachytí. Ve scénáři poškozeného stavu obecná obslužná rutina zachytí výjimku pouze v případě, že metodu označíte atributem System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute . Modul CLR (Common Language Runtime) ve výchozím nastavení nevyvolává obslužné rutiny catch pro csE.
Nejbezpečnější možností je umožnit, aby se proces chybově ukončil bez zachycení těchto druhů výjimek. Dokonce i protokolovací kód může útočníkům umožnit zneužít chyby poškození paměti.
Toto upozornění se aktivuje při zachycení sdílených svazků s obecnou obslužnou rutinou, která zachytí všechny výjimky, catch (System.Exception e)
například nebo catch
bez parametru výjimky.
Jak opravit porušení
Pokud chcete toto upozornění vyřešit, udělejte jednu z těchto věcí:
HandleProcessCorruptedStateExceptionsAttribute Odeberte atribut. Tím se vrátíte k výchozímu chování za běhu, kdy se objekty CSE nepředají obslužným rutinám zachycení.
Odeberte obecnou obslužnou rutinu catch v předvolbách obslužných rutin, které zachytí konkrétní typy výjimek. To může zahrnovat csE za předpokladu, že kód obslužné rutiny je může bezpečně zpracovat (vzácné).
Znovu načte csE v obslužné rutině catch, která předá výjimku volajícímu a měla by vést k ukončení spuštěného procesu.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad pseudokódu
Porušení
Následující pseudokód znázorňuje vzor zjištěný tímto pravidlem.
[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Řešení 1 – odebrání atributu
Odebráním atributu HandleProcessCorruptedStateExceptionsAttribute zajistíte, že vaše metoda nezpracuje výjimky poškozeného stavu.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Řešení 2 – zachycení konkrétních výjimek
Odeberte obecnou obslužnou rutinu catch a zachyťte pouze konkrétní typy výjimek.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (IOException e)
{
// Handle IOException.
}
catch (UnauthorizedAccessException e)
{
// Handle UnauthorizedAccessException.
}
}
Řešení 3 – opětovné zvětšování
Znovu zvětšte výjimku.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}