Share via


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 8 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.");
    }
}

Confira também