CA2153: не обрабатывайте исключения поврежденного состояния
Свойство | Значение |
---|---|
Идентификатор правила | CA2153 |
Заголовок | Не обрабатывайте исключения поврежденного состояния |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | 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;
}
}