CA2109: Revisar manipuladores de eventos visíveis
Propriedade | valor |
---|---|
ID da regra | CA2109 |
Cargo | Revisar manipuladores de eventos visíveis |
Categoria | Segurança |
A correção está quebrando ou não quebrando | Quebrando |
Habilitado por padrão no .NET 8 | Não |
Causa
Foi detetado um método de manipulação de eventos público ou protegido.
Nota
Esta regra foi preterida. Ele foi fornecido 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 alertou (um intermediário não confiável que conecta um manipulador de eventos privilegiado a um invocador de evento privilegiado) não existe desde o .NET Framework 4.5.
Descrição da regra
Um método de manipulação de eventos visível externamente apresenta um problema de segurança que requer revisão.
Não exponha métodos de manipulação de eventos, a menos que seja absolutamente necessário. Um manipulador de eventos, um tipo de delegado, que invoca o método exposto pode ser adicionado a qualquer evento, desde que o manipulador e as assinaturas de evento correspondam. Os eventos podem ser gerados por qualquer código e são frequentemente gerados por um código de 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 manipulação 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 forma confiável um método invocado por um manipulador de eventos. As demandas de segurança ajudam a proteger o código de 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 manipulador de eventos é invocado. Isso faz com que as demandas feitas pelo método manipulador de eventos sejam bem-sucedidas. Além disso, a permissão exigida pode ser afirmada quando o método é invocado. Por estas razões, o risco de não corrigir uma violação desta regra só pode ser avaliado após a revisão do método de tratamento de eventos. Ao revisar seu código, considere os seguintes problemas:
Seu manipulador de eventos executa operações perigosas ou exploráveis, como declarar permissões ou suprimir permissões de código não gerenciado?
Quais são as ameaças de segurança de e para o 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, revise o método e avalie o seguinte:
É possível 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 exigência de segurança é imposta, isso pode ser feito de alguma outra maneira?
Quando suprimir avisos
Suprima um aviso desta regra somente após uma análise de segurança cuidadosa para garantir que seu código não represente uma ameaça à segurança.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none
Para obter mais informações, consulte 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 indevidamente 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.");
}
}