Direitos de segurança e acesso do processo
O modelo de segurança do Microsoft Windows permite que você controle o acesso a objetos de processo. Para obter mais informações sobre segurança, consulte Access-Control Model.
Quando um usuário faz logon, o sistema coleta um conjunto de dados que identifica exclusivamente o usuário durante o processo de autenticação e o armazena em um token de acesso . Esse token de acesso descreve o contexto de segurança de todos os processos associados ao usuário. O contexto de segurança de um processo é o conjunto de credenciais fornecidas ao processo ou à conta de usuário que criou o processo.
Você pode usar um token para especificar o contexto de segurança atual para um processo usando a função CreateProcessWithTokenW. Você pode especificar um de descritor de segurança para um processo ao chamar a função CreateProcess, CreateProcessAsUserou CreateProcessWithLogonW. Se você especificar NULL, o processo obterá um descritor de segurança padrão. As ACLs no descritor de segurança padrão para um processo vêm do token primário ou de representação do criador.
Para recuperar o descritor de segurança de um processo, chame a função GetSecurityInfo. Para alterar o descritor de segurança de um processo, chame a funçãoSetSecurityInfo.
Os direitos de acesso válidos para objetos de processo incluem os direitos de acesso padrão e alguns direitos de acesso específicos ao processo. A tabela a seguir lista os direitos de acesso padrão usados por todos os objetos.
A tabela a seguir lista os direitos de acesso específicos ao processo.
Valor | Significado |
---|---|
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) | SYNCHRONIZE (0x00100000L) | 0xFFFF) | Todos os direitos de acesso possíveis para um objeto de processo.Windows Server 2003 e Windows XP: O tamanho do sinalizador de PROCESS_ALL_ACCESS aumentou no Windows Server 2008 e no Windows Vista. Se um aplicativo compilado para Windows Server 2008 e Windows Vista for executado no Windows Server 2003 ou Windows XP, o sinalizador PROCESS_ALL_ACCESS será muito grande e a função que especifica esse sinalizador falhará com ERROR_ACCESS_DENIED. Para evitar esse problema, especifique o conjunto mínimo de direitos de acesso necessários para a operação. Se PROCESS_ALL_ACCESS precisar ser usado, defina _WIN32_WINNT para o sistema operacional mínimo direcionado pelo aplicativo (por exemplo, #define _WIN32_WINNT _WIN32_WINNT_WINXP ). Para obter mais informações, consulte Usando os cabeçalhos do Windows. |
PROCESS_CREATE_PROCESS (0x0080) | Necessário para usar esse processo como o processo pai com PROC_THREAD_ATTRIBUTE_PARENT_PROCESS. |
PROCESS_CREATE_THREAD (0x0002) | Necessário para criar um thread no processo. |
PROCESS_DUP_HANDLE (0x0040) | Necessário para duplicar um identificador usando DuplicateHandle. |
PROCESS_QUERY_INFORMATION (0x0400) | Necessário para recuperar determinadas informações sobre um processo, como seu token, código de saída e classe de prioridade (consulte OpenProcessToken). |
PROCESS_QUERY_LIMITED_INFORMATION (0x1000) | Necessário para recuperar determinadas informações sobre um processo (consulte GetExitCodeProcess, GetPriorityClass, IsProcessInJob, QueryFullProcessImageName). Um identificador que tem o direito de acesso PROCESS_QUERY_INFORMATION é concedido automaticamente PROCESS_QUERY_LIMITED_INFORMATION.Windows Server 2003 e Windows XP: não há suporte para esse direito de acesso. |
PROCESS_SET_INFORMATION (0x0200) | Necessário para definir determinadas informações sobre um processo, como sua classe de prioridade (consulte SetPriorityClass). |
PROCESS_SET_QUOTA (0x0100) | Necessário para definir limites de memória usando SetProcessWorkingSetSize. |
PROCESS_SUSPEND_RESUME (0x0800) | Necessário para suspender ou retomar um processo. |
PROCESS_TERMINATE (0x0001) | Necessário para encerrar um processo usando TerminateProcess. |
PROCESS_VM_OPERATION (0x0008) | Necessário para executar uma operação no espaço de endereço de um processo (consulte VirtualProtectEx e WriteProcessMemory). |
PROCESS_VM_READ (0x0010) | Necessário para ler memória em um processo usando ReadProcessMemory . |
PROCESS_VM_WRITE (0x0020) | Necessário para gravar na memória em um processo usando WriteProcessMemory. |
SYNCHRONIZE (0x00100000L) | Necessário aguardar o término do processo usando as funções de espera . |
Para abrir um identificador para outro processo e obter direitos de acesso total, você deve habilitar o privilégio SeDebugPrivilege. Para obter mais informações, consulte Alterando privilégios em um token.
O identificador retornado pela função CreateProcess tem acesso PROCESS_ALL_ACCESS ao objeto de processo. Quando você chama a função OpenProcess, o sistema verifica os direitos de acesso solicitados em relação à DACL no descritor de segurança do processo. Quando você chama a função GetCurrentProcess, o sistema retorna um pseudohandle com o acesso máximo que a DACL permite ao chamador.
Você pode solicitar o acesso ACCESS_SYSTEM_SECURITY direito a um objeto de processo se quiser ler ou gravar o SACL do objeto. Para obter mais informações, consulte de listas deAccess-Control (ACLs) e à direita do ACESSO SACL.
Aviso
Um processo que tem alguns dos direitos de acesso observados aqui pode usá-los para obter outros direitos de acesso. Por exemplo, se o processo A tiver um identificador para processar B com acesso PROCESS_DUP_HANDLE, ele poderá duplicar o pseudo-identificador para o processo B. Isso cria um identificador que tem acesso máximo ao processo B. Para obter mais informações sobre pseudo-identificadores, consulte GetCurrentProcess.
Processos protegidos
O Windows Vista apresenta processos protegidos para aprimorar o suporte ao Digital Rights Management. O sistema restringe o acesso a processos protegidos e aos threads de processos protegidos.
Os seguintes direitos de acesso padrão não são permitidos de um processo para um processo protegido:
- EXCLUIR
- READ_CONTROL
- WRITE_DAC
- WRITE_OWNER
Os seguintes direitos de acesso específicos não são permitidos de um processo para um processo protegido:
- 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
O PROCESS_QUERY_LIMITED_INFORMATION direito foi introduzido para fornecer acesso a um subconjunto das informações disponíveis por meio de PROCESS_QUERY_INFORMATION.