CA2153: Verhindern, dass Ausnahmen bei Beschädigungen verarbeitet werden
Eigenschaft | Wert |
---|---|
Regel-ID | CA2153 |
Titel | Verhindern, dass Ausnahmen bei Beschädigungen verarbeitet werden |
Kategorie | Security |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Corrupted State Exceptions (CSE) weisen auf eine Speicherbeschädigung innerhalb des Prozesses hin. Diese abzufangen, statt einen Absturz des Prozesses zuzulassen, führt zu Sicherheitsrisiken, falls ein Angreifer einen Exploit in den beschädigten Speicherbereich einschleusen kann.
Regelbeschreibung
CSE gibt an, dass der Zustand eines Prozesses beschädigt wurde und nicht vom System abgefangen wurde. Im Szenario, das sich auf einen beschädigten Zustand bezieht, wird die Ausnahme von einem allgemeinen Handler nur abgefangen, wenn Sie Ihre Methode mit dem Attribut System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute markieren. Von der Common Language Runtime (CLR) werden standardmäßig keine Catch-Handler für CSEs aufgerufen.
Die sicherste Option besteht darin, den Prozess abstürzen zu lassen, ohne diese Art von Ausnahmen abfangen zu müssen. Durch die Protokollierung von Code können Angreifer Speicher-Corruption-Fehler ausnutzen.
Diese Warnung wird ausgelöst, wenn CSEs mit einem allgemeinen Handler abgefangen werden, der alle Ausnahmen abfängt (z. B. catch (System.Exception e)
oder catch
ohne Ausnahmeparameter).
Behandeln von Verstößen
Führen Sie zum Vermeiden dieser Warnung eine oder mehrere der folgenden Aktionen aus:
Entfernen Sie das HandleProcessCorruptedStateExceptionsAttribute-Attribut. Dadurch wird wieder das Standardverhalten der Laufzeit hergestellt, bei dem CSEs nicht an Catch-Handler übergeben werden.
Entfernen Sie den allgemeinen Catch-Handler zugunsten von Handlern, die bestimmte Ausnahmetypen abfangen. Dazu können auch CSEs gehören, vorausgesetzt, dass sie vom Handlercode sicher behandelt werden können (selten).
Lösen Sie die CSE im Catch-Handler erneut aus. So wird sichergestellt, dass die Ausnahme an den Aufrufenden übergeben wird, wodurch der laufende Prozess beendet wird.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Pseudocodebeispiel
Verletzung
Der folgende Pseudocode veranschaulicht das von dieser Regel erkannte Muster.
[HandleProcessCorruptedStateExceptions]
// Method that handles CSE exceptions.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Lösung 1: Entfernen des Attributs
Durch Entfernen des HandleProcessCorruptedStateExceptionsAttribute-Attributs wird sichergestellt, dass Corrupted State Exceptions nicht von Ihrer Methode behandelt werden.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Handle exception.
}
}
Lösung 2: Abfangen spezifischer Ausnahmen
Entfernen Sie den allgemeinen Catch-Handler, und fangen Sie nur bestimmte Ausnahmetypen ab.
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (IOException e)
{
// Handle IOException.
}
catch (UnauthorizedAccessException e)
{
// Handle UnauthorizedAccessException.
}
}
Lösung 3: Erneut auslösen
Lösen Sie die Ausnahme erneut aus.
[HandleProcessCorruptedStateExceptions]
void TestMethod1()
{
try
{
FileStream fileStream = new FileStream("name", FileMode.Create);
}
catch (Exception e)
{
// Rethrow the exception.
throw;
}
}