Udostępnij za pośrednictwem


CA2153: Unikaj obsługi wyjątków uszkodzonego stanu

Właściwości Wartość
Identyfikator reguły CA2153
Tytuł Unikaj obsługiwania wyjątków stanu uszkodzenia
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Wyjątki stanu uszkodzenia (CSE) wskazują na istnienie uszkodzenia pamięci w twoim procesie. Przechwycenie tych elementów zamiast zezwalania na awarię procesu może prowadzić do luk w zabezpieczeniach, jeśli osoba atakująca może umieścić luki w zabezpieczeniach w uszkodzonym regionie pamięci.

Opis reguły

CSE wskazuje, że stan procesu został uszkodzony i nie został wykryty przez system. W scenariuszu uszkodzonego stanu program obsługi ogólnej przechwytuje wyjątek tylko wtedy, gdy oznaczysz metodę za pomocą atrybutu System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute . Domyślnie środowisko uruchomieniowe języka wspólnego (CLR) nie wywołuje obsługi catch dla CSE.

Najbezpieczniejszą opcją jest umożliwienie awarii procesu bez przechwytywania tego rodzaju wyjątków. Nawet kod rejestrowania może umożliwić osobom atakującym wykorzystanie usterek uszkodzenia pamięci.

Ostrzeżenie jest wyzwalane podczas przechwytywania CSEs za pomocą ogólnego obsługiwacza, który przechwytuje wszystkie wyjątki, na przykład catch (System.Exception e) lub catch bez parametru wyjątku.

Jak naprawić naruszenia

Aby rozwiązać to ostrzeżenie, wykonaj jedną z następujących czynności:

  • HandleProcessCorruptedStateExceptionsAttribute Usuń atrybut. Spowoduje to przywrócenie domyślnego zachowania środowiska uruchomieniowego, w którym csEs nie są przekazywane do programów obsługi przechwytywania.

  • Usuń ogólną procedurę obsługi catch w preferencjach procedur obsługi, które przechwytują określone typy wyjątków. Może to obejmować CSE, przy założeniu, że kod obsługi może bezpiecznie je obsłużyć (rzadko).

  • Ponownie przeróć csE w procedurze obsługi catch, która przekazuje wyjątek do elementu wywołującego i powinna spowodować zakończenie uruchomionego procesu.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Przykład pseudo-kodu

Naruszenie

Poniższy pseudo-kod ilustruje wzorzec wykryty przez tę regułę.

[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Rozwiązanie 1 — usuwanie atrybutu

Usunięcie atrybutu HandleProcessCorruptedStateExceptionsAttribute zapewnia, że wyjątki stanu uszkodzonego nie są obsługiwane przez twoją metodę.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Rozwiązanie 2 — łapanie określonych wyjątków

Usuń ogólną procedurę obsługi catch i przechwyć tylko określone typy wyjątków.

void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (IOException e)
    {
        // Handle IOException.
    }
    catch (UnauthorizedAccessException e)
    {
        // Handle UnauthorizedAccessException.
    }
}

Rozwiązanie 3 — ponowne rzucenie

Ponownie rzuć wyjątek.

[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Rethrow the exception.
        throw;
    }
}