CA2109: 표시되는 이벤트 처리기를 검토하십시오.
TypeName |
ReviewVisibleEventHandlers |
CheckId |
CA2109 |
범주 |
Microsoft.Security |
변경 수준 |
주요 변경 |
원인
public 또는 protected 이벤트 처리 메서드를 발견했습니다.
규칙 설명
외부에서 볼 수 있는 이벤트 처리 메서드는 보안 문제가 발생할 수 있으므로 검토가 필요합니다.
이벤트 처리 메서드는 반드시 필요한 경우를 제외하고 노출하면 안 됩니다.노출된 메서드를 호출하는 대리자 형식인 이벤트 처리기는 처리기와 이벤트 시그니처가 일치하기만 하면 모든 이벤트에 추가될 수 있습니다.이벤트는 모든 코드에서 발생할 수 있으며 신뢰 수준이 높은 시스템 코드에서 단추 클릭과 같은 사용자 작업에 대한 응답으로 자주 발생합니다.이벤트 처리 메서드에 보안 검사를 추가해도 코드를 통해 메서드를 호출하는 이벤트 처리기의 등록을 막을 수 없습니다.
요청으로는 이벤트 처리기에서 호출하는 메서드를 안정적으로 보호할 수 없습니다.보안 요청은 호출 스택에서 호출자를 검사함으로써 신뢰할 수 없는 호출자로부터 코드를 보호하는 데 도움이 됩니다.이벤트 처리기의 메서드가 실행될 때 이벤트 처리기를 이벤트에 추가한 코드가 호출 스택에 반드시 존재하는 것은 아닙니다.따라서 이벤트 처리기 메서드가 호출될 때 호출 스택에 신뢰 수준이 높은 호출자만 있을 수 있습니다.이로 인해 이벤트 처리기에서 보낸 요청이 성공하게 됩니다.또한 요청된 권한이 메서드가 호출될 때 어설션될 수도 있습니다.이러한 이유로 이 규칙 위반 문제를 해결하지 않을 경우의 위험 수준은 이벤트 처리 메서드를 검토한 후에만 평가할 수 있습니다.코드를 검토할 때 다음과 같은 문제를 고려하십시오.
이벤트 처리기가 권한 어설션 또는 비관리 코드 권한 숨기기와 같은 위험하거나 악용될 가능성이 있는 작업을 수행하는지 여부
스택에 신뢰 수준이 높은 호출자만 있을 때 언제든지 코드가 실행되어 발생할 수 있는 보안 위협
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 메서드를 검토하고 다음을 평가합니다.
이벤트 처리 메서드를 public이 아닌 메서드로 만들 수 있는지 여부
위험한 기능을 모두 이벤트 처리기 외부로 이동할 수 있는지 여부
보안 요청을 적용해야 하는 경우 다른 방식으로 수행할 수 있는지 여부
경고를 표시하지 않는 경우
신중하게 보안 문제를 검토하여 코드에 보안 위험이 없음이 확인된 후에만 이 규칙에 따른 경고를 표시하지 마십시오.
예제
다음 코드에서는 악의적인 코드를 통해 잘못 사용될 수 있는 이벤트 처리 메서드를 보여 줍니다.
using System;
using System.Security;
using System.Security.Permissions;
namespace EventSecLibrary
{
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.");
}
}
}