CA2109: Revisar los controladores de eventos visibles

Propiedad Value
Identificador de la regla CA2109
Título Revisar los controladores de eventos visibles
Categoría Seguridad
La corrección interrumpe o no interrumpe Problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Se detectó un método de control de eventos público o protegido.

Nota

Esta regla está en desuso. Se distribuyó por última vez con el paquete NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 y el SDK de .NET 7.

La regla se eliminó porque la amenaza sobre la que advertía el analizador (un intermediario que no es de confianza que enlaza un controlador de eventos con privilegios a un invocador de eventos con privilegios) no existe desde .NET Framework 4.5.

Descripción de la regla

Un método de control de eventos visibles externamente presenta un problema de seguridad que requiere revisión.

No exponga los métodos de control de eventos a menos que sea absolutamente necesario. Se puede agregar un controlador de eventos, un tipo de delegado, que invoca el método expuesto a cualquier evento, siempre y cuando el controlador y las firmas de eventos coincidan. Los eventos puede generarlos cualquier código y se suelen generar mediante código del sistema de plena confianza en respuesta a las acciones del usuario, como hacer clic en un botón. Agregar una comprobación de seguridad a un método de control de eventos no impide que el código registre un controlador de eventos que invoca el método.

Una demanda no puede proteger de forma fiable un método invocado por un controlador de eventos. Las peticiones de seguridad ayudan a proteger el código de los autores de la llamada que no son de confianza mediante el examen de los autores de la llamada en la pila de llamadas. El código que agrega un controlador de eventos a un evento no tiene que estar necesariamente presente en la pila de llamadas cuando se ejecutan los métodos del controlador de eventos. Por lo tanto, la pila de llamadas puede tener solo autores de la llamada de plena confianza cuando se invoca el método de controlador de eventos. Esto hace que las peticiones realizadas por el método del controlador de eventos se realicen correctamente. Además, puede realizarse la aserción del permiso exigido cuando se invoca el método. Por estos motivos, el riesgo de no corregir una infracción de esta regla solo se puede evaluar después de revisar el método de control de eventos. Al revisar el código, tenga en cuenta los siguientes problemas:

  • ¿El controlador de eventos realiza algún tipo de operación peligrosa o vulnerable, como la aserción de permisos o la supresión de permisos de código no administrado?

  • ¿Cuáles son las amenazas de seguridad hacia y desde el código porque puede ejecutarse en cualquier momento solo mediante autores de la llamada de gran confianza en la pila?

Cómo corregir infracciones

Para corregir una infracción de esta regla, revise el método y evalúe lo siguiente:

  • ¿Puede hacer que el método de control de eventos no sea público?

  • ¿Puede trasladar toda la funcionalidad peligrosa fuera del controlador de eventos?

  • Si existe una demanda de seguridad, ¿se puede llevar a cabo de alguna otra manera?

Cuándo suprimir las advertencias

Suprima una advertencia de esta regla solo después de una revisión de seguridad minuciosa, para asegurarse de que el código no plantea una amenaza de seguridad.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el código siguiente se muestra un método de control de eventos que puede utilizado de forma incorrecta por código malintencionado.

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 también