CA2109: Examinar manipuladores de eventos visíveis
Property | Valor |
---|---|
ID da regra | CA2109 |
Título | Examinar manipuladores de eventos visíveis |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Quebra |
Habilitado por padrão no .NET 9 | Não |
Causa
Um método público ou protegido de tratamento de eventos foi detectado.
Observação
Esta regra foi preterida. Ele foi enviado pela última vez com o pacote NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 e o SDK do .NET 7.
A regra foi removida porque a ameaça sobre a qual o analisador alertava (um intermediário não confiável que conecta um manipulador de eventos privilegiado a um invocador de eventos privilegiado) não existe desde o .NET Framework 4.5.
Descrição da regra
Um método de tratamento de eventos externamente visível apresenta um problema de segurança que requer revisão.
Não exponha métodos de tratamento de eventos, a menos que seja absolutamente necessário. Um manipulador de eventos, um tipo delegado, que invoca o método exposto pode ser adicionado a qualquer evento, desde que o manipulador e as assinaturas de evento correspondam. Potencialmente, os eventos podem ser gerados por qualquer código e costumam gerados pelo código do sistema altamente confiável em resposta a ações do usuário, como clicar em um botão. Adicionar uma verificação de segurança a um método de tratamento de eventos não impede que o código registre um manipulador de eventos que invoca o método.
Uma demanda não pode proteger de modo confiável um método invocado por um manipulador de eventos. As demandas de segurança ajudam a proteger o código contra chamadores não confiáveis examinando os chamadores na pilha de chamadas. O código que adiciona um manipulador de eventos a um evento não está necessariamente presente na pilha de chamadas quando os métodos do manipulador de eventos são executados. Portanto, a pilha de chamadas pode ter apenas chamadores altamente confiáveis quando o método do manipulador de eventos é invocado. Isso faz com que as demandas feitas pelo método do manipulador de eventos tenham êxito. Além disso, a permissão exigida pode ser declarada quando o método é invocado. Por esses motivos, o risco de não corrigir uma violação dessa regra só pode ser avaliado após a revisão do método de tratamento de eventos. Ao examinar seu código, considere os seguintes problemas:
O manipulador de eventos executa operações perigosas ou exploráveis, como a declaração de permissões ou a supressão da permissão de código não gerenciado?
Quais são as ameaças de segurança de e para seu código porque ele pode ser executado a qualquer momento apenas com chamadores altamente confiáveis na pilha?
Como corrigir violações
Para corrigir uma violação dessa regra, examine o método e avalie o seguinte:
Você pode tornar o método de manipulação de eventos não público?
Você pode mover todas as funcionalidades perigosas para fora do manipulador de eventos?
Se uma demanda de segurança for imposta, isso poderá ser feito de alguma outra maneira?
Quando suprimir avisos
Suprima um aviso dessa regra somente após uma revisão de segurança cuidadosa para garantir que seu código não represente uma ameaça à segurança.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplo
O código a seguir mostra um método de manipulação de eventos que pode ser usado incorretamente por código mal-intencionado.
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.");
}
}