Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2153 |
| Název | Vyhněte se zpracování výjimek v poškozeném stavu |
| Kategorie | Zabezpečení |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Ne |
| Příslušné jazyky | C# a Visual Basic |
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í nevolá 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í CSE pomocí obecné obslužné rutiny, která zachytí všechny výjimky, například catch (System.Exception e) 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í:
Odeberte atribut HandleProcessCorruptedStateExceptionsAttribute. Tím se vrátíte k výchozímu chování modulu runtime, při kterém se CSE nejsou předány obslužným rutinám catch.
Odeberte obecnou obslužnou rutinu catch a nahraďte ji obslužnými rutinami, které zachytí konkrétní typy výjimek. To může zahrnovat CSE, za předpokladu, že obslužný kód je může bezpečně zpracovat (což je 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 obecný zachytávací blok a používejte 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 – znovuvyhození výjimky
Znovu vyhoďte výjimku.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}