Partilhar via


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

Consulte também