다음을 통해 공유


Windows Forms의 추가 보안 고려 사항

.NET Framework 보안 설정으로 인해 부분적으로 신뢰할 수 있는 환경에서는 로컬 컴퓨터에서와는 다르게 애플리케이션이 실행될 수 있습니다. .NET Framework에서는 여러 가지 중에서도 파일 시스템, 네트워크, 비관리 API와 같은 중요한 로컬 리소스에 대한 액세스를 제한합니다. 보안 설정은 Microsoft Windows API 또는 보안 시스템에서 확인할 수 없는 기타 API를 호출하는 기능에 영향을 줍니다. 또한 파일, 데이터 액세스, 인쇄를 비롯한 애플리케이션의 다른 측면에도 영향을 줍니다. 부분 신뢰 환경에서의 파일 및 데이터 액세스에 대한 자세한 내용은 Windows Forms의 파일 및 데이터 액세스 추가 보안을 참조하세요. 부분 신뢰 환경에서의 인쇄에 대한 자세한 내용은 Windows Forms의 인쇄 추가 보안을 참조하세요.

다음 섹션에서는 부분 신뢰 환경에서 실행되는 애플리케이션에서의 클립보드 사용, 창 조작 수행, Windows API 호출 방법에 대해 설명합니다.

클립보드 액세스

합니다 UIPermission 클래스를 클립보드에 연결 된 액세스 제어 UIPermissionClipboard 열거형 값에 대 한 액세스 수준을 나타냅니다. 다음 표에서는 가능한 권한 수준을 보여 줍니다.

UIPermissionClipboard 값 Description
AllClipboard 클립보드 사용에 제한을 받지 않습니다.
OwnClipboard 약간의 제한을 받으면서 클립보드를 사용할 수 있습니다. 복사 또는 잘라내기 명령 작업과 같이 클립보드에 데이터를 넣는 기능은 제한을 받지 않습니다. 텍스트 상자와 같이 붙여넣기를 허용하는 내장 컨트롤은 클립보드 데이터를 받아들일 수 있지만 사용자 정의 컨트롤은 프로그래밍 방식으로 클립보드에서 데이터를 읽을 수는 없습니다.
NoClipboard 클립보드를 사용할 수 없습니다.

기본적으로 로컬 인트라넷 영역은 AllClipboard 액세스를 수신하고 인터넷 영역은 OwnClipboard 액세스를 수신합니다. 이것은 애플리케이션에서 클립보드에 데이터를 복사할 수 있지만 프로그래밍 방식으로 클립보드에 데이터를 붙여넣거나 클립보드에서 데이터를 읽을 수는 없다는 것을 의미합니다. 이러한 제한으로 인해 신뢰 수준이 완전 신뢰가 아닌 프로그램은 다른 애플리케이션이 클립보드에 복사한 내용을 읽을 수 없습니다. 애플리케이션에 클립보드에 대한 모든 액세스가 필요하지만 해당 권한이 없을 경우에는 애플리케이션의 권한을 높여야 합니다. 권한 높이기에 대한 자세한 내용은 일반 보안 정책 관리를 참조하세요.

창 조작

또한 UIPermission 클래스는 창 조작 및 기타 UI 관련 작업을 수행할 수 있는 권한을 제어하며 연결된 UIPermissionWindow 열거형 값은 액세스 수준을 나타냅니다. 다음 표에서는 가능한 권한 수준을 보여 줍니다.

기본적으로 로컬 인트라넷 영역은 AllWindows 액세스를 수신하고 인터넷 영역은 SafeTopLevelWindows 액세스를 수신합니다. 이것은 인터넷 영역에서는 애플리케이션이 대부분의 창 작업 및 UI 작업을 수행할 수 있지만 창의 모양은 수정된다는 것을 의미합니다. 처음 실행한 경우 수정된 창에는 풍선 알림과 수정된 제목 표시줄 텍스트가 표시되며, 제목 표시줄에 닫기 단추가 필요합니다. 풍선 알림과 제목 표시줄은 애플리케이션 사용자에게 애플리케이션이 부분 신뢰 환경에서 실행되고 있음을 알려 줍니다.

UIPermissionWindow 값 Description
AllWindows 사용자는 모든 창과 사용자 입력 이벤트를 제한 없이 사용할 수 있습니다.
SafeTopLevelWindows 사용자가 안전한 최상위 창과 안전한 하위 창만 그리기 작업에 사용할 수 있고, 이러한 최상위 창 및 하위 창 내의 사용자 인터페이스에는 사용자 입력 이벤트만 사용할 수 있습니다. 이러한 안전한 창에는 명확하게 레이블이 지정되며 최소 및 최대 크기 제한이 있습니다. 이러한 제한은 시스템 로그온 화면이나 시스템 바탕 화면을 모방하는 등의 악의적인 스푸핑 공격을 방지하며 프로그래밍 방식으로 부모 창과 포커스 관련 API에 액세스하거나 ToolTip 컨트롤을 사용하는 것을 제한합니다.
SafeSubWindows 사용자가 안전한 하위 창만 그리기 작업에 사용할 수 있고, 해당 하위 창 내의 사용자 인터페이스에는 사용자 입력 이벤트만 사용할 수 있습니다. 예를 들어, 브라우저 내에 표시되는 컨트롤은 안전한 하위 창입니다.
NoWindows 사용자가 창이나 사용자 인터페이스 이벤트를 사용할 수 없습니다. 사용자 인터페이스를 사용할 수 없습니다.

UIPermissionWindow 열거형이 나타내는 각 권한 수준은 각 상위 권한 수준보다 더 적은 수의 작업을 허용합니다. 다음 표는 SafeTopLevelWindowsSafeSubWindows 값으로 제한되는 작업을 나타냅니다. 각 멤버에 필요한 정확한 권한은 .NET Framework 클래스 라이브러리 설명서에서 해당 멤버의 항목을 참조하세요.

SafeTopLevelWindows 권한은 다음 표에 나열된 작업을 제한합니다.

구성 요소 제한된 작업
Application - SafeTopLevelCaptionFormat 속성을 설정합니다.
Control - Parent 속성을 가져옵니다.
- Region 속성을 설정합니다.
- FindForm, Focus, FromChildHandle, FromHandle, PreProcessMessage, ReflectMessage 또는 SetTopLevel 메서드를 호출합니다.
- 반환된 컨트롤이 호출 컨트롤의 자식이 아닌 경우 GetChildAtPoint 메서드를 호출합니다.
- 컨테이너 컨트롤 내에서 컨트롤 포커스를 수정합니다.
Cursor - Clip 속성을 설정합니다.
- Hide 메서드를 호출합니다.
DataGrid - ProcessTabKey 메서드를 호출합니다.
Form - ActiveForm 또는 MdiParent 속성을 가져옵니다.
- ControlBox, ShowInTaskbar 또는 TopMost 속성을 설정합니다.
- Opacity 속성을 50% 미만으로 설정합니다.
- 프로그래밍 방식으로 WindowState 속성을 Minimized로 설정합니다.
- Activate 메서드를 호출합니다.
- None, FixedToolWindow, SizableToolWindowFormBorderStyle 열거형 값을 사용합니다.
NotifyIcon - NotifyIcon 구성 요소를 사용하는 것은 완전히 제한됩니다.

SafeSubWindows 값은 SafeTopLevelWindows 값에 의해 부여된 제한 사항 외에 다음 표에 나열된 작업을 제한합니다.

구성 요소 제한된 작업
CommonDialog - CommonDialog 클래스에서 파생된 대화 상자를 보여 줍니다.
Control - CreateGraphics 메서드를 호출합니다.
- Cursor 속성을 설정합니다.
Cursor - Current 속성을 설정합니다.
MessageBox - Show 메서드를 호출합니다.

타사 컨트롤 호스팅

다른 종류의 창 조작은 양식에서 타사 컨트롤을 호스팅하는 경우에 발생할 수 있습니다. 타사 컨트롤은 사용자가 직접 개발하여 컴파일하지 않은 사용자 지정 UserControl입니다. 호스팅 시나리오를 악용하기는 어렵지만 타사 컨트롤이 렌더링 화면을 확장하여 사용자 양식의 전체 영역을 가리는 것이 논리적으로 가능합니다. 이 컨트롤은 중요한 대화 상자를 모방하여 사용자 이름/암호 조합이나 은행 계좌 번호 등의 정보를 사용자에게 요청할 수 있습니다.

이러한 잠재적인 위험을 방지하려면 신뢰할 수 있는 공급업체의 타사 컨트롤만 사용해야 합니다. 확인할 수 없는 소스에서 다운로드한 타사 컨트롤을 사용할 경우에는 소스 코드를 검토하여 악용 가능성이 있는지 확인하는 것이 좋습니다. 소스에 악의적인 내용이 없는지 확인한 후 어셈블리를 직접 컴파일하여 소스와 어셈블리가 일치하는지 확인해야 합니다.

Windows API 호출

애플리케이션을 디자인할 때 Windows API 함수의 호출이 필요한 경우 비관리 코드에 액세스하게 됩니다. 이 경우 Windows API 호출이나 값을 사용할 때는 코드가 창이나 운영 체제에 대해 수행하는 작업을 확인할 수 없습니다. SecurityPermission 클래스와 SecurityPermissionFlag 열거형의 UnmanagedCode 값은 비관리 코드에 대한 액세스를 제어합니다. 애플리케이션은 UnmanagedCode 권한이 부여된 경우에만 비관리 코드에 액세스할 수 있습니다. 기본적으로 로컬에서 실행되고 있는 애플리케이션만 비관리 코드에 액세스할 수 있습니다.

일부 Windows Forms 멤버는 UnmanagedCode 권한이 필요한 비관리 액세스를 제공합니다. 다음 표에서는 이 권한을 필요로 하는 System.Windows.Forms 네임스페이스의 멤버를 나열합니다. 멤버에 필요한 권한에 대한 자세한 내용은 .NET Framework 클래스 라이브러리 설명서를 참조하세요.

구성 요소 멤버
Application - AddMessageFilter 메서드
- CurrentInputLanguage 속성
- Exit 메서드
- ExitThread 메서드
- ThreadException 이벤트
CommonDialog - HookProc 메서드
- OwnerWndProc\ 메서드
- Reset 메서드
- RunDialog 메서드
Control - CreateParams 메서드
- DefWndProc 메서드
- DestroyHandle 메서드
- WndProc 메서드
Help - ShowHelp 메서드
- ShowHelpIndex 메서드
NativeWindow - NativeWindow 클래스
Screen - FromHandle 메서드
SendKeys - Send 메서드
- SendWait 메서드

애플리케이션에 비관리 코드를 호출할 수 있는 권한이 없을 경우에는 애플리케이션에서 UnmanagedCode 권한을 요청하거나 해당 기능을 구현할 수 있는 다른 방법을 고려해야 합니다. 대부분의 경우 Windows Forms는 Windows API 함수를 관리형으로 호출할 수 있는 대안을 제공합니다. 이러한 대안이 없는 상황에서 비관리 코드에 액세스해야 할 경우에는 애플리케이션의 권한을 높여야 합니다.

비관리 코드를 호출할 수 있는 권한을 부여하면 애플리케이션이 거의 모든 작업을 수행할 수 있습니다. 따라서 비관리 코드를 호출할 수 있는 권한은 신뢰할 수 있는 소스의 애플리케이션에만 부여해야 합니다. 또는 애플리케이션에 따라 비관리 코드를 호출하는 기능을 옵션으로 지정하거나 완전 신뢰 환경에서만 이 기능을 사용하도록 할 수 있습니다. 위험한 권한에 대한 자세한 내용은 위험한 권한 및 정책 관리를 참조하세요. 권한 높이기에 대한 자세한 내용은 일반 보안 정책 관리를 참조하세요.

참고 항목