Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2153 |
| Заголовок | Не обрабатывайте исключения поврежденного состояния |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Исключения поврежденного состояния (CSE) указывают на то, что в процессе имеется повреждение памяти. Если перехватывать их вместо того, чтобы позволить процессу завершиться сбоем, это может привести к уязвимостям в системе безопасности, если злоумышленнику удастся поместить эксплойт в поврежденную область памяти.
Описание правила
Исключение CSE указывает на то, что состояние процесса было повреждено и не обнаружено системой. В сценарии нарушения состояния общий обработчик перехватывает исключение только в том случае, если вы пометили метод атрибутом System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute. По умолчанию среда CLR не вызывает обработчики catch для исключений CSE.
Самый безопасный вариант — разрешить аварийное завершение процесса без перехвата исключений такого типа. Даже код ведения журналов может позволить злоумышленникам использовать ошибки повреждения памяти.
Это предупреждение срабатывает при перехвате исключений CSE с помощью общего обработчика, который перехватывает все исключения, например catch (System.Exception e) или catch, без параметра исключения.
Устранение нарушений
Чтобы устранить эту проблему, выполните любое из следующих действий.
Удалите атрибут HandleProcessCorruptedStateExceptionsAttribute. Это возвращает поведение среды выполнения по умолчанию, когда CSEs не передаются обработчикам исключений.
Удалите универсальный обработчик исключений и используйте обработчики, которые перехватывают исключения определенных типов. Это могут быть исключения CSE, при условии, что код обработчика может безопасно их обработать (что бывает редко).
Повторно создайте исключение CSE в обработчике catch, чтобы передать его вызывающему объекту и вызвать завершение выполняющегося процесса.
Когда лучше отключить предупреждения
Для этого правила отключать вывод предупреждений не следует.
Пример псевдокода
Нарушение
В приведенном ниже псевдокоде показан шаблон, обнаруживаемый этим правилом.
[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Решение 1. Удаление атрибута
При удалении атрибута HandleProcessCorruptedStateExceptionsAttribute исключения поврежденного состояния не будут обрабатываться методом.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Решение 2 - обработка определенных исключений
Удалите универсальный обработчик исключений и перехватывайте только исключения определенных типов.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (IOException e)
{
// Handle IOException.
}
catch (UnauthorizedAccessException e)
{
// Handle UnauthorizedAccessException.
}
}
Решение 3 - повторный выброс
Повторно создайте исключение.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}