CA2153: Evitar el control de excepciones de estado dañadas

Propiedad Value
Identificador de la regla CA2153
Título Evitar el control de excepciones de estado dañadas
Categoría Seguridad
La corrección interrumpe o no interrumpe Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Las excepciones de estado dañado (CSE) indican que la memoria está dañada en el proceso. Detectar estos problemas y evitar el bloqueo del proceso puede provocar vulnerabilidades de seguridad si un atacante puede colocar una vulnerabilidad de seguridad en la región de memoria dañada.

Descripción de la regla

CSE indica que el estado de un proceso se ha dañado y el sistema no lo ha detectado. En el escenario de estado dañado, un controlador general solo detecta la excepción si se marca el método con el atributo System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute. De forma predeterminada, Common Language Runtime (CLR) no invoca controladores catch de CSE.

La opción más segura consiste en permitir que el proceso se bloquee sin detectar estos tipos de excepciones. Incluso el código de registro puede permitir a los atacantes aprovechar errores de daños en la memoria.

Esta advertencia se desencadena cuando se detectan CSE con un controlador general que detecta todas las excepciones, como catch (System.Exception e) o catch sin parámetro de excepción.

Cómo corregir infracciones

Para solucionar la advertencia, realice una de las acciones siguientes:

  • Quite el atributo HandleProcessCorruptedStateExceptionsAttribute. Esto revierte el comportamiento de entorno de ejecución predeterminado en el que las CSE no se pasan a los controladores catch.

  • Quite el controlador catch general y use controladores que capturen tipos de excepción específicos. Esto puede incluir CSE suponiendo que el código del controlador puede controlarlas de manera segura (caso poco frecuente).

  • Vuelva a iniciar la CSE en el controlador catch, que pasa la excepción al autor de la llamada y dará como resultado la finalización del proceso en ejecución.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo de pseudocódigo

Infracción

El pseudocódigo siguiente muestra el patrón que detecta esta regla.

[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
    try
    {
        FileStream fileStream = new FileStream("name", FileMode.Create);
    }
    catch (Exception e)
    {
        // Handle exception.
    }
}

Solución 1: Quitar el atributo

Al quitar el atributo HandleProcessCorruptedStateExceptionsAttribute se garantiza que el método no controla las excepciones de estado dañado.

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

Solución 2: Detectar las excepciones específicas

Quite el controlador catch general y detecte solo los tipos determinados de excepción.

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

Solución 3: Reiniciar

Vuelva a iniciar la excepción.

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