Share via


CA2109: 표시되는 이벤트 처리기를 검토하십시오.

속성
규칙 ID CA2109
타이틀 표시되는 이벤트 처리기를 검토하세요.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경
.NET 8에서 기본적으로 사용 아니요

원인

public 또는 protected 이벤트 처리 메서드를 발견했습니다.

참고 항목

이 규칙은 더 이상 사용되지 않습니다. 마지막으로 Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet 패키지 및 .NET 7 SDK와 함께 제공되었습니다.

.NET Framework 4.5 이후 분석기에서 경고한 위협(권한 있는 이벤트 처리기를 권한 있는 이벤트 호출자에 연결하는 신뢰할 수 없는 중간자)이 없기 때문에 규칙이 제거되었습니다.

규칙 설명

외부에 표시되는 이벤트 처리 메서드는 검토가 필요한 보안 문제를 표시합니다.

이벤트 처리 메서드는 꼭 필요한 경우에만 노출합니다. 노출된 메서드를 호출하는 이벤트 처리기인 대리자 형식은 처리기 및 이벤트 시그니처가 일치하는 경우 이벤트에 추가할 수 있습니다. 이벤트는 코드에 의해 발생할 수 있으며 단추 클릭과 같은 사용자 동작에 대한 응답으로 완전히 신뢰할 수 있는 시스템 코드에 의해 발생하는 경우가 많습니다. 이벤트 처리 메서드에 보안 검사를 추가해도 코드에서 메서드를 호출하는 이벤트 처리기를 등록하는 것을 방지할 수 없습니다.

요청은 이벤트 처리기에서 호출되는 메서드를 안정적으로 보호할 수 없습니다. 보안 요청은 호출 스택에서 호출자를 검사하여 신뢰할 수 없는 호출자로부터 코드를 보호하는 데 도움이 됩니다. 이벤트에 이벤트 처리기를 추가하는 코드는 이벤트 처리기의 메서드가 실행될 때 호출 스택에 반드시 있어야 하는 것은 아닙니다. 따라서 이벤트 처리기 메서드가 호출될 때 호출 스택에는 완전히 신뢰할 수 있는 호출자만 있을 수 있습니다. 이로 인해 이벤트 처리기 메서드에 의한 요청이 성공합니다. 또한 메서드가 호출될 때 요청된 사용 권한을 어설션할 수 있습니다. 이러한 이유로 이 규칙의 위반 문제를 해결하지 않는 위험은 이벤트 처리 메서드를 검토한 후에만 평가할 수 있습니다. 코드를 검토할 때 다음 문제를 고려하세요.

  • 이벤트 처리기가 사용 권한 어설션이나 비관리 코드 사용 권한 중지와 같이 위험하거나 악용 가능성이 있는 작업을 수행하나요?

  • 스택에서 완전히 신뢰할 수 있는 호출자만 사용하여 언제든지 실행할 수 있기 때문에 코드에서 발생할 수 있는 보안 위협은 무엇인가요?

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 메서드를 검토하고 다음을 평가하세요.

  • 이벤트 처리 메서드를 public이 아닌 메서드로 만들 수 있나요?

  • 이벤트 처리기에서 모든 위험한 기능을 이동할 수 있나요?

  • 보안 요청이 적용되는 경우 다른 방법으로 달성할 수 있나요?

경고를 표시하지 않는 경우

코드로 인해 보안 위협이 발생하지 않도록 하려면 신중한 보안 검토 후에만 이 규칙의 경고를 표시하지 않습니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

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

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

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

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

예시

다음 코드에서는 악성 코드에서 오용할 수 있는 이벤트 처리 메서드를 보여 줍니다.

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

참고 항목