Поделиться через


Безопасность потоков и права доступа

Microsoft Windows позволяет управлять доступом к объектам потоков. Дополнительные сведения о безопасности см. в разделе Модель управления доступом.

Дескриптор безопасности для потока можно указать при вызове функции CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateThread или CreateRemoteThread. Если указать значение NULL, поток получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для потока поступают из основного маркера или маркера олицетворения создателя.

Чтобы получить дескриптор безопасности потока, вызовите функцию 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: Значение флага THREAD_ALL_ACCESS увеличено в Windows Server 2008 и Windows Vista. Если приложение, скомпилированное для 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) Требуется для приостановки или возобновления потока (см. статью SuspendThread и ResumeThread).
THREAD_TERMINATE (0x0001) Требуется для завершения потока с помощью TerminateThread.

 

Вы можете запросить право доступа ACCESS_SYSTEM_SECURITY к объекту потока, если вы хотите прочитать или записать saCL объекта. Дополнительные сведения см. в разделах Списки управления доступом (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_LIMITED_INFORMATION право для предоставления доступа к подмножества информации, доступной через THREAD_QUERY_INFORMATION.