Udostępnij za pośrednictwem


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

Właściwości Wartość
Identyfikator reguły CA2153
Stanowisko Unikaj obsługiwania wyjątków stanu uszkodzenia
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Uszkodzone wyjątki stanu (CSE) wskazują, że uszkodzenie pamięci istnieje w 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ł przechwycony 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 programów obsługi catch dla csEs.

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.

To ostrzeżenie jest wyzwalane podczas przechwytywania cses z ogólną procedurą obsługi, która 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 czasu wykonywania, 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 przykładowy kod przykładowy

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 gwarantuje, że wyjątki stanu uszkodzonego nie są obsługiwane przez metodę .

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

Rozwiązanie 2 — przechwytywanie 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 wróć

Ponownie wywróć wyjątek.

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