Безопасность процесса и права доступа
Модель безопасности Microsoft Windows позволяет управлять доступом к объектам обработки. Дополнительные сведения о безопасности см. в разделе Модель управления доступом.
Когда пользователь входит в систему, система собирает набор данных, которые уникально идентифицируют пользователя в процессе проверки подлинности, и сохраняет их в маркере доступа. Этот маркер доступа описывает контекст безопасности всех процессов, связанных с пользователем. Контекст безопасности процесса — это набор учетных данных, предоставленных процессу или учетной записи пользователя, создавшего процесс.
Маркер можно использовать для указания текущего контекста безопасности для процесса с помощью функции CreateProcessWithTokenW . Дескриптор безопасности для процесса можно указать при вызове функции CreateProcess, CreateProcessAsUser или CreateProcessWithLogonW. Если указать значение NULL, процесс получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для процесса поступают из основного маркера или токена олицетворения создателя.
Чтобы получить дескриптор безопасности процесса, вызовите функцию GetSecurityInfo . Чтобы изменить дескриптор безопасности процесса, вызовите функцию SetSecurityInfo .
Допустимые права доступа для объектов процессов включают стандартные права доступа и некоторые права доступа для конкретного процесса. В следующей таблице перечислены стандартные права доступа, используемые всеми объектами.
Значение | Значение |
---|---|
DELETE (0x00010000L) | Требуется для удаления объекта. |
READ_CONTROL (0x00020000L) | Требуется для чтения сведений в дескрипторе безопасности для объекта, не включая сведения в saCL. Чтобы прочитать или записать saCL, необходимо запросить право доступа ACCESS_SYSTEM_SECURITY . Дополнительные сведения см. в разделе Права доступа к SACL. |
SYNCHRONIZE (0x00100000L) | Право на использование данного объекта для синхронизации. Это позволяет потоку ждать, пока объект не перейдет в состояние сигнала. |
WRITE_DAC (0x00040000L) | Требуется для изменения DACL в дескрипторе безопасности для объекта . |
WRITE_OWNER (0x00080000L) | Требуется для изменения владельца в дескрипторе безопасности для объекта . |
В следующей таблице перечислены права доступа для конкретного процесса.
Значение | Значение |
---|---|
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) | SYNCHRONIZE (0x00100000L) | 0xFFFF) | Все возможные права доступа для объекта процесса. Windows Server 2003 и Windows XP: Размер флага PROCESS_ALL_ACCESS увеличен в Windows Server 2008 и Windows Vista. Если приложение, скомпилированное для Windows Server 2008 и Windows Vista, выполняется в Windows Server 2003 или Windows XP, флаг PROCESS_ALL_ACCESS слишком велик, а функция, указывающая этот флаг, завершается сбоем с ERROR_ACCESS_DENIED. Чтобы избежать этой проблемы, укажите минимальный набор прав доступа, необходимых для операции. Если необходимо использовать PROCESS_ALL_ACCESS , задайте для _WIN32_WINNT минимальную операционную систему, предназначенную для вашего приложения (например, #define _WIN32_WINNT _WIN32_WINNT_WINXP ). Дополнительные сведения см. в разделе Использование заголовков Windows. |
PROCESS_CREATE_PROCESS (0x0080) | Требуется для использования этого процесса в качестве родительского процесса с PROC_THREAD_ATTRIBUTE_PARENT_PROCESS. |
PROCESS_CREATE_THREAD (0x0002) | Требуется для создания потока в процессе. |
PROCESS_DUP_HANDLE (0x0040) | Требуется для дублирования дескриптора с помощью DuplicateHandle. |
PROCESS_QUERY_INFORMATION (0x0400) | Требуется для получения определенных сведений о процессе, таких как его токен, код выхода и класс приоритета (см. Раздел OpenProcessToken). |
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) | Требуется для получения определенных сведений о процессе (см. раздел GetExitCodeProcess, GetPriorityClass, IsProcessInJob, QueryFullProcessImageName). Дескриптор с правом доступа PROCESS_QUERY_INFORMATION автоматически предоставляется PROCESS_QUERY_LIMITED_INFORMATION. Windows Server 2003 и Windows XP: Это право доступа не поддерживается. |
PROCESS_SET_INFORMATION (0x0200) | Требуется для задания определенных сведений о процессе, таких как его класс приоритета (см. раздел SetPriorityClass). |
PROCESS_SET_QUOTA (0x0100) | Требуется для установки ограничений памяти с помощью SetProcessWorkingSetSize. |
PROCESS_SUSPEND_RESUME (0x0800) | Требуется для приостановки или возобновления процесса. |
PROCESS_TERMINATE (0x0001) | Требуется для завершения процесса с помощью TerminateProcess. |
PROCESS_VM_OPERATION (0x0008) | Требуется для выполнения операции с адресным пространством процесса (см. статьи VirtualProtectEx и WriteProcessMemory). |
PROCESS_VM_READ (0x0010) | Требуется для чтения памяти в процессе с помощью ReadProcessMemory. |
PROCESS_VM_WRITE (0x0020) | Требуется для записи в память в процессе с помощью WriteProcessMemory. |
SYNCHRONIZE (0x00100000L) | Требуется для ожидания завершения процесса с помощью функций ожидания. |
Чтобы открыть дескриптор для другого процесса и получить права полного доступа, необходимо включить привилегию SeDebugPrivilege . Дополнительные сведения см. в разделе Изменение привилегий в токене.
Дескриптор, возвращаемый функцией CreateProcess, имеет PROCESS_ALL_ACCESS доступ к объекту процесса. При вызове функции OpenProcess система проверяет запрошенные права доступа по daCL в дескрипторе безопасности процесса. При вызове функции GetCurrentProcess система возвращает псевдоhandle с максимальным доступом, который daCL разрешает вызывающей объекту.
Вы можете запросить у ACCESS_SYSTEM_SECURITY права доступа к объекту процесса, если вы хотите прочитать или записать saCL объекта. Дополнительные сведения см. в разделах Списки управления доступом (ACL) и Права доступа saCL.
Предупреждение
Процесс, имеющий некоторые права доступа, приведенные здесь, может использовать их для получения других прав доступа. Например, если у процесса A есть дескриптор для обработки B с PROCESS_DUP_HANDLE доступом, он может дублировать псевдо дескриптор для процесса B. При этом создается дескриптор с максимальным доступом к процессу B. Дополнительные сведения о псевдо дескрипторах см. в разделе GetCurrentProcess.
Защищенные процессы
В Windows Vista представлены защищенные процессы для улучшения поддержки управления цифровыми правами. Система ограничивает доступ к защищенным процессам и потокам защищенных процессов.
Следующие стандартные права доступа от процесса к защищенному процессу не допускаются:
- DELETE
- READ_CONTROL
- WRITE_DAC
- WRITE_OWNER
Следующие конкретные права доступа не допускаются из процесса в защищенный процесс:
- PROCESS_ALL_ACCESS
- PROCESS_CREATE_PROCESS
- PROCESS_CREATE_THREAD
- PROCESS_DUP_HANDLE
- PROCESS_QUERY_INFORMATION
- PROCESS_SET_INFORMATION
- PROCESS_SET_QUOTA
- PROCESS_VM_OPERATION
- PROCESS_VM_READ
- PROCESS_VM_WRITE
Было введено PROCESS_QUERY_LIMITED_INFORMATION право для предоставления доступа к подмножества информации, доступной через PROCESS_QUERY_INFORMATION.