CA2109: 표시되는 이벤트 처리기를 검토하십시오.
속성 | 값 |
---|---|
규칙 ID | CA2109 |
제목 | 표시되는 이벤트 처리기를 검토하세요. |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
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.");
}
}
참고 항목
.NET