Compartilhar via


CA2153: Evitar tratamento de Exceções de Estado Corrompido

Property Valor
ID da regra CA2153
Título Evitar tratamento de Exceções de Estado Corrompido
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

As CSE (exceções de estado corrompido) indicam que há corrupção de memória no processo. Capturá-las em vez de permitir que o processo falhe pode levar a vulnerabilidades de segurança, pois um invasor poderia colocar um exploit na região da memória corrompida.

Descrição da regra

O CSE indica que o estado de um processo foi corrompido e não capturado pelo sistema. No cenário de estado corrompido, um manipulador geral só captura a exceção se você marcar seu método com o System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute atributo. Por padrão, o CLR (Common Language Runtime) não invoca manipuladores de captura para CSEs.

A opção mais segura é permitir que o processo falhe sem capturar esses tipos de exceções. Mesmo o código de log pode permitir que os invasores explorem bugs de corrupção de memória.

Esse aviso dispara ao capturar CSEs com um manipulador geral que captura todas as exceções, por exemplo, catch (System.Exception e) ou catch sem nenhum parâmetro de exceção.

Como corrigir violações

Para resolver esse problema, execute uma das seguintes ações:

  • Remova o atributo HandleProcessCorruptedStateExceptionsAttribute. Isso reverte para o comportamento de tempo de execução padrão em que os CSEs não são passados para capturar manipuladores.

  • Remova o manipulador de captura geral na preferência de manipuladores que capturam tipos de exceção específicos. Isso pode incluir CSEs, supondo que o código do manipulador possa lidar com eles com segurança (raro).

  • Execute novamente o CSE no manipulador de captura, que passa a exceção para o chamador e deve resultar no término do processo em execução.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplos de pseudocódigo

Violação

O pseudocódigo a seguir ilustra o padrão detectado por essa regra.

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

Solução 1 – remover o atributo

A remoção do HandleProcessCorruptedStateExceptionsAttribute atributo garante que exceções de estado corrompidas não sejam tratadas pelo seu método.

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

Solução 2 – capturar exceções específicas

Remova o manipulador geral de captura e capture apenas tipos de exceção específicos.

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

Solução 3 – rethrow

Recuançar a exceção.

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