CA2109: Zkontrolujte viditelné obslužné rutiny událostí
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2109 |
Název | Zkontrolujte viditelné obslužné rutiny událostí |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Narušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
Byla zjištěna veřejná nebo chráněná metoda zpracování událostí.
Poznámka:
Toto pravidlo je zastaralé. Naposledy se odeslal s balíčkem NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 a sadou .NET 7 SDK.
Pravidlo bylo odebráno, protože hrozba, na kterou analyzátor upozornil (nedůvěryhodný zprostředkovatel, který připojí obslužnou rutinu privilegované události k privilegovanému vyvolání události), neexistovala od rozhraní .NET Framework 4.5.
Popis pravidla
Externě viditelná metoda zpracování událostí představuje problém se zabezpečením, který vyžaduje kontrolu.
Nezpřístupňujte metody zpracování událostí, pokud to není nezbytně nutné. Obslužná rutina události, typ delegáta, která vyvolá vystavenou metodu, lze přidat do jakékoli události, pokud obslužná rutina a podpisy událostí odpovídají. Události mohou být vyvolány libovolným kódem a často jsou vyvolány vysoce důvěryhodným systémovým kódem v reakci na akce uživatelů, jako je kliknutí na tlačítko. Přidání kontroly zabezpečení do metody zpracování událostí nezabrání kódu v registraci obslužné rutiny události, která vyvolá metodu.
Požadavek nemůže spolehlivě chránit metodu vyvolanou obslužnou rutinou události. Požadavky na zabezpečení pomáhají chránit kód před nedůvěryhodnými volajícími prozkoumáním volajících v zásobníku volání. Kód, který přidá obslužnou rutinu události do události, nemusí být nutně k dispozici v zásobníku volání při spuštění metod obslužné rutiny události. Zásobník volání proto může mít při vyvolání metody obslužné rutiny události pouze vysoce důvěryhodné volající. To způsobí úspěšné požadavky provedené metodou obslužné rutiny události. Také požadované oprávnění může být uplatněno při vyvolání metody. Z těchto důvodů je možné riziko, že nebudete opravovat porušení tohoto pravidla, posoudit pouze po kontrole metody zpracování událostí. Při kontrole kódu zvažte následující problémy:
Provádí obslužná rutina události nějaké operace, které jsou nebezpečné nebo zneužitelné, jako je například uplatnění oprávnění nebo potlačení nespravovaného oprávnění ke kódu?
Jaké jsou bezpečnostní hrozby pro váš kód a z něj, protože může běžet kdykoli s jen vysoce důvěryhodnými volajícími na zásobníku?
Jak opravit porušení
Pokud chcete opravit porušení tohoto pravidla, zkontrolujte metodu a vyhodnoťte následující:
Můžete nastavit, aby metoda zpracování událostí byla neveřejná?
Můžete přesunout všechny nebezpečné funkce z obslužné rutiny události?
Pokud je vynucována poptávka po zabezpečení, lze toho dosáhnout nějakým jiným způsobem?
Kdy potlačit upozornění
Potlačit upozornění z tohoto pravidla pouze po pečlivé kontrole zabezpečení, abyste měli jistotu, že váš kód nepředstavuje bezpečnostní hrozbu.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad
Následující kód ukazuje metodu zpracování událostí, kterou může zneužít škodlivý kód.
public class HandleEvents
{
// Due to the access level and signature, a malicious caller could
// add this method to system-triggered events where all code in the call
// stack has the demanded permission.
// Also, the demand might be canceled by an asserted permission.
[SecurityPermissionAttribute(SecurityAction.Demand, UnmanagedCode = true)]
// Violates rule: ReviewVisibleEventHandlers.
public static void SomeActionHappened(Object sender, EventArgs e)
{
Console.WriteLine("Do something dangerous from unmanaged code.");
}
}