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