Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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;
}
}