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, 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;
    }
}