Sdílet prostřednictvím


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.

Poznámka k upozornění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;
}