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

Модель безопасности 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.