Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| 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;
}
}