CA2153 : Éviter la gestion des exceptions d’état altéré

Propriété Valeur
Identificateur de la règle CA2153
Titre Éviter de gérer les exceptions d'état corrompu
Catégorie Sécurité
Le correctif a un effet disruptif ou non disruptif Sans rupture
Activé par défaut dans .NET 10 Non
Langues applicables C# et Visual Basic

Cause

Les Corrupted State Exceptions (CSEs) indiquent qu'il existe une corruption de mémoire dans votre processus. Le fait d’intercepter ces exceptions au lieu d’autoriser le processus à se bloquer peut engendrer des failles de sécurité si une personne malveillante réussit à placer une attaque dans la région de la mémoire endommagée.

Description de la règle

Le CSE indique que l’état d’un processus a été corrompu et n’a pas été détecté par le système. Dans un scénario d’état altéré, un gestionnaire général intercepte uniquement l’exception si vous marquez votre méthode au moyen de l’attribut System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute. Par défaut, le Common Language Runtime (CLR) n’appelle pas les gestionnaires catch pour les exceptions état altéré.

L’option la plus sûre consiste à autoriser le processus à s'arrêter sans intercepter ces exceptions. Même le code de journalisation peut permettre aux attaquants d’exploiter les bogues d’altération de la mémoire.

Cet avertissement se déclenche lors de la capture des exceptions d'état de corruption (CSEs) avec un gestionnaire général qui attrape toutes les exceptions, par exemple catch (System.Exception e) ou catch sans paramètre d’exception.

Comment corriger les violations

Pour résoudre cet avertissement, effectuez l'une des opérations suivantes :

  • Supprimez l'attribut HandleProcessCorruptedStateExceptionsAttribute. Cela rétablit le comportement d’exécution par défaut où les CSE ne sont pas passées aux gestionnaires catch.

  • Supprimer le gestionnaire catch général et privilégier les gestionnaires qui interceptent des types d’exceptions spécifiques. Cela peut inclure des CSEs, en supposant que le code du gestionnaire peut les gérer de manière sécurisée (ce qui est rare).

  • Relancez l’exception CSE dans le gestionnaire d’exception, ce qui passe l’exception à l’appelant et doit entraîner l’arrêt du processus en cours d’exécution.

Quand supprimer les avertissements

Ne supprimez pas un avertissement provenant de cette règle.

Exemple de pseudo-code

Infraction

Le pseudo-code suivant illustre le modèle détecté par cette règle.

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

Solution 1 : Supprimer l’attribut

La suppression de l’attribut HandleProcessCorruptedStateExceptionsAttribute garantit que les exceptions d'état corrompu ne sont pas gérées par votre méthode.

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

Solution 2 : Intercepter des exceptions spécifiques

Supprimez le gestionnaire d’exceptions général et interceptez uniquement des types d’exceptions spécifiques.

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

Solution 3 : Relancer

Levez à nouveau l’exception.

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