CA2124: Anfällige finally-Klauseln mit äußerem try-Block umschließen
TypeName |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
Kategorie |
Microsoft.Security |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
In den Versionen 1.0 und 1.1 von .NET Framework enthält eine öffentliche oder geschützte Methode einen try/catch/finally-Block. Durch den finally-Block, der nicht in einen finally-Block eingeschlossen ist, wird anscheinend der Sicherheitszustand zurückgesetzt.
Regelbeschreibung
Diese Regel sucht in Code, der auf die Versionen 1.0 und 1.1 von .NET Framework abzielt, try/finally-Blöcke, die für böswillige Ausnahmefilter in der Aufrufliste anfällig sein könnten. Wenn vertrauliche Vorgänge wie ein Identitätswechsel im try-Block stattfinden und eine Ausnahme ausgelöst wird, kann der Filter vor dem finally-Block ausgeführt werden. Bei dem Beispiel mit Identitätswechsel bedeutet dies, dass der Filter als Benutzer ausgeführt wird, für den ein Identitätswechsel vorgenommen wurde. Filter können derzeit nur in Visual Basic implementiert werden.
Warnung
Hinweis In Version 2.0 und höher von .NET Framework schützt die Laufzeit einen try/catch/finally-Block automatisch vor böswilligen Ausnahmefiltern, wenn die Rücksetzung direkt innerhalb der Methode auftritt, die den Ausnahmeblock enthält.
Behandeln von Verstößen
Fügen Sie den allein stehenden try/finally-Block in einen äußeren try-Block ein. Vergleichen Sie das folgende zweite Beispiel. Dabei wird finally zwangsweise vor dem Filtercode ausgeführt.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Beispiel für Pseudocode
Beschreibungen
Mit dem folgenden Pseudocode wird das von dieser Regel erkannte Muster veranschaulicht.
Code
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
Beispiel
Im folgenden Pseudocode wird das Muster dargestellt, das Sie verwenden können, um den Code zu schützen und diese Regel zu erfüllen.
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}