Sdílet prostřednictvím


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