스레드 보안 및 액세스 권한

Microsoft Windows를 사용하면 스레드 개체에 대한 액세스를 제어할 수 있습니다. 보안에 대한 자세한 내용은 Access-Control 모델을 참조하세요.

CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateThread 또는 CreateRemoteThread 함수를 호출할 때 스레드에 대한 보안 설명자를 지정할 수 있습니다. NULL을 지정하는 경우 스레드는 기본 보안 설명자를 가져옵니다. 스레드에 대한 기본 보안 설명자의 ACL은 작성자의 기본 또는 가장 토큰에서 가져옵니다.

스레드의 보안 설명자를 검색하려면 GetSecurityInfo 함수를 호출합니다. 스레드의 보안 설명자를 변경하려면 SetSecurityInfo 함수를 호출합니다.

CreateThread 함수에서 반환된 핸들에는 스레드 개체에 대한 THREAD_ALL_ACCESS 액세스 권한이 있습니다. GetCurrentThread 함수를 호출하면 시스템은 스레드의 보안 설명자가 호출자에게 허용하는 최대 액세스 권한이 있는 의사 핸들을 반환합니다.

스레드 개체에 대한 유효한 액세스 권한에는 표준 액세스 권한 및 일부 스레드별 액세스 권한이 포함됩니다. 다음 표에서는 모든 개체에서 사용하는 표준 액세스 권한을 나열합니다.

의미
DELETE (0x00010000L) 개체를 삭제하는 데 필요합니다.
READ_CONTROL (0x00020000L) SACL의 정보를 포함하지 않고 개체의 보안 설명자에서 정보를 읽는 데 필요합니다. SACL을 읽거나 쓰려면 ACCESS_SYSTEM_SECURITY 액세스 권한을 요청해야 합니다. 자세한 내용은 SACL 액세스 권한을 참조하세요.
SYNCHRONIZE (0x00100000L) 동기화에 개체를 사용할 수 있는 권한입니다. 이렇게 하면 개체가 신호 상태가 될 때까지 스레드가 대기할 수 있습니다.
WRITE_DAC (0x00040000L) 개체의 보안 설명자에서 DACL을 수정하는 데 필요합니다.
WRITE_OWNER (0x00080000L) 개체의 보안 설명자에서 소유자를 변경해야 합니다.

 

다음 표에서는 스레드별 액세스 권한을 나열합니다.

의미
SYNCHRONIZE (0x00100000L) 대기 함수에서 스레드 핸들을 사용할 수 있습니다.
THREAD_ALL_ACCESS 스레드 개체에 대해 가능한 모든 액세스 권한입니다. Windows Server 2003 및 Windows XP: Windows Server 2008 및 Windows Vista에서 THREAD_ALL_ACCESS 플래그 값이 증가했습니다. Windows Server 2008 및 Windows Vista용으로 컴파일된 애플리케이션이 Windows Server 2003 또는 Windows XP에서 실행되는 경우 THREAD_ALL_ACCESS 플래그에는 지원되지 않는 액세스 비트가 포함되며 이 플래그를 지정하는 함수는 ERROR_ACCESS_DENIED 실패합니다. 이 문제를 방지하려면 작업에 필요한 최소 액세스 권한 집합을 지정합니다. THREAD_ALL_ACCESS 사용해야 하는 경우 _WIN32_WINNT 애플리케이션이 대상으로 하는 최소 운영 체제(예#define _WIN32_WINNT _WIN32_WINNT_WINXP: )로 설정합니다. 자세한 내용은 Windows 헤더 사용을 참조하세요.
THREAD_DIRECT_IMPERSONATION (0x0200) 클라이언트를 가장하는 서버 스레드에 필요합니다.
THREAD_GET_CONTEXT (0x0008) GetThreadContext를 사용하여 스레드의 컨텍스트를 읽는 데 필요합니다.
THREAD_IMPERSONATE (0x0100) 가장 서비스를 제공하는 통신 메커니즘을 사용하여 스레드의 보안 정보를 호출하지 않고 직접 사용해야 합니다.
THREAD_QUERY_INFORMATION (0x0040) 종료 코드와 같은 스레드 개체에서 특정 정보를 읽는 데 필요합니다( GetExitCodeThread 참조).
THREAD_QUERY_LIMITED_INFORMATION (0x0800) 스레드 개체에서 특정 정보를 읽는 데 필요합니다( GetProcessIdOfThread 참조). THREAD_QUERY_INFORMATION 액세스 권한이 있는 핸들은 THREAD_QUERY_LIMITED_INFORMATION 자동으로 부여됩니다. Windows Server 2003 및 Windows XP: 이 액세스 권한은 지원되지 않습니다.
THREAD_SET_CONTEXT (0x0010) SetThreadContext를 사용하여 스레드의 컨텍스트를 작성하는 데 필요합니다.
THREAD_SET_INFORMATION (0x0020) 스레드 개체에서 특정 정보를 설정하는 데 필요합니다.
THREAD_SET_LIMITED_INFORMATION (0x0400) 스레드 개체에서 특정 정보를 설정하는 데 필요합니다. THREAD_SET_INFORMATION 액세스 권한이 있는 핸들은 THREAD_SET_LIMITED_INFORMATION 자동으로 부여됩니다. Windows Server 2003 및 Windows XP: 이 액세스 권한은 지원되지 않습니다.
THREAD_SET_THREAD_TOKEN (0x0080) SetThreadToken을 사용하여 스레드에 대한 가장 토큰을 설정하는 데 필요합니다.
THREAD_SUSPEND_RESUME (0x0002) 스레드를 일시 중단하거나 다시 시작하는 데 필요합니다( SuspendThreadResumeThread 참조).
THREAD_TERMINATE (0x0001) TerminateThread를 사용하여 스레드를 종료하는 데 필요합니다.

 

개체의 SACL을 읽거나 쓰려는 경우 스레드 개체에 대한 ACCESS_SYSTEM_SECURITY 액세스 권한을 요청할 수 있습니다. 자세한 내용은 ACL(액세스 제어 목록)SACL 액세스 권한을 참조하세요.

보호된 프로세스

보호된 프로세스는 디지털 권한 관리에 대한 지원을 강화합니다. 시스템은 보호된 프로세스 및 보호된 프로세스의 스레드에 대한 액세스를 제한합니다.

Windows Server 2003 및 Windows XP: 보호된 프로세스가 Windows Vista부터 추가되었습니다.

다음 특정 액세스 권한은 프로세스에서 보호된 프로세스의 스레드로 허용되지 않습니다.

THREAD_ALL_ACCESS
THREAD_DIRECT_IMPERSONATION
THREAD_GET_CONTEXT
THREAD_IMPERSONATE
THREAD_QUERY_INFORMATION
THREAD_SET_CONTEXT
THREAD_SET_INFORMATION
THREAD_SET_TOKEN
THREAD_TERMINATE

THREAD_QUERY_INFORMATION 통해 사용할 수 있는 정보의 하위 집합에 대한 액세스를 제공하기 위해 THREAD_QUERY_LIMITED_INFORMATION 권한이 도입되었습니다.