CA2153: не обрабатывайте исключения поврежденного состояния

Свойство Значение
Идентификатор правила CA2153
Заголовок Не обрабатывайте исключения поврежденного состояния
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Исключения поврежденного состояния (CSE) указывают на то, что в процессе имеется повреждение памяти. Если перехватывать их вместо того, чтобы позволить процессу завершиться сбоем, это может привести к уязвимостям в системе безопасности, если злоумышленнику удастся поместить эксплойт в поврежденную область памяти.

Описание правила

Исключение CSE указывает на то, что состояние процесса было повреждено, и не перехватывается системой. В случае повреждения состояния общий обработчик перехватывает это исключение, только если вы пометили метод атрибутом System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute. По умолчанию среда CLR не вызывает обработчики catch для исключений CSE.

Наиболее надежный вариант — разрешить аварийное завершение процесса без перехвата исключений такого типа. Даже код ведения журналов может позволить злоумышленникам использовать ошибки повреждения памяти.

Это предупреждение срабатывает при перехвате исключений CSE с помощью общего обработчика, который перехватывает все исключения, например catch (System.Exception e) или catch, без параметра исключения.

Устранение нарушений

Чтобы устранить эту проблему, выполните любое из следующих действий.

  • Удалите атрибут HandleProcessCorruptedStateExceptionsAttribute. При этом восстанавливается поведение среды выполнения по умолчанию, при котором исключения CSE не передаются в обработчики catch.

  • Удалите общий обработчик catch и используйте обработчики, перехватывающие исключения определенных типов. Это могут быть и исключения 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. Перехват определенных исключений

Удалите общий обработчик catch и перехватывайте только исключения определенных типов.

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