CA2124: Zabalte ohroženou klauzuli finally do vnějšího bloku try
TypeName |
WrapVulnerableFinallyClausesInOuterTry |
CheckId |
CA2124 |
Kategorie |
Microsoft.Security |
Narušující změna |
Nenarušující |
Příčina
Veřejná nebo chráněná metoda ve verzi 1.0 nebo 1.1 rozhraní .NET Framework obsahuje blok try/catch/finally.Vypadá to, že blok finally resetuje stav zabezpečení a není uzavřen v bloku finally.
Popis pravidla
Toto pravidlo vyhledá v kódu, určeném pro verzi 1.0 nebo 1.1 rozhraní .NET Framework, bloky try/finally, které mohou být zranitelné vůči škodlivým filtrům výjimek v zásobníku volání.Pokud blok try obsahuje citlivé operace, jako např. zosobnění, a je v jeho průběhu vyvolána výjimka, může být její filtr spuštěn ještě před blokem finally.Pro příklad zosobnění to znamená, že by byl filtr spuštěn pod zosobněným uživatelem.Filtry lze aktuálně implementovat pouze v jazyce Visual Basic.
Upozornění |
---|
Poznámka: Počínaje verzí 2.0 rozhraní .NET Framework jsou bloky try/catch/ finally automaticky chráněny modulem runtime před škodlivými filtry výjimek, pokud resetování probíhá přímo v metodě obsahující takový blok výjimky. |
Jak vyřešit porušení
Umístěte neobalený blok try/finally do vnějšího bloku.Více informací naleznete v druhém příkladu, který následuje.To vynutí provedení bloku finally před provedením kódu filtru.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad v pseudokódu
Description
Následující pseudokód ukazuje vzor zjištěný tímto pravidlem.
Kód
try {
// Do some work.
Impersonator imp = new Impersonator("John Doe");
imp.AddToCreditCardBalance(100);
}
finally {
// Reset security state.
imp.Revert();
}
Příklad
Následující pseudokód ukazuje vzor, který může být použit pro ochranu kódu a splnění tohoto pravidla.
try {
try {
// Do some work.
}
finally {
// Reset security state.
}
}
catch()
{
throw;
}