Direitos de segurança e acesso do processo
O modelo de segurança do Microsoft Windows permite controlar o acesso a objetos de processo. Para obter mais informações sobre segurança, consulte Modelo de controle de acesso.
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 os 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 descritor de segurança para um processo ao chamar a função CreateProcess, CreateProcessAsUser ou 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ção SetSecurityInfo .
Os direitos de acesso válidos para objetos de processo incluem os direitos de acesso padrão e alguns direitos de acesso específicos do processo. A tabela a seguir lista os direitos de acesso padrão usados por todos os objetos.
Valor | Significado |
---|---|
DELETE (0x00010000L) | Necessário para excluir o objeto. |
READ_CONTROL (0x00020000L) | Necessário para ler informações no descritor de segurança do objeto, não incluindo as informações na SACL. Para ler ou gravar a SACL, você deve solicitar o direito de acesso ACCESS_SYSTEM_SECURITY . Para obter mais informações, confira Direito de Acesso à SACL. |
SYNCHRONIZE (0x00100000L) | O direito de usar o objeto para sincronização. Isso permite que um thread aguarde até que o objeto esteja no estado sinalizado. |
WRITE_DAC (0x00040000L) | Necessário para modificar a DACL no descritor de segurança do objeto. |
WRITE_OWNER (0x00080000L) | Necessário para alterar o proprietário no descritor de segurança para o objeto . |
A tabela a seguir lista os direitos de acesso específicos do 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 o Windows Server 2008 e o Windows Vista for executado no Windows Server 2003 ou no 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 a 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 para aguardar o término do processo usando as funções de espera. |
Para abrir um identificador para outro processo e obter direitos de acesso completos, 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 PROCESS_ALL_ACCESS acesso 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 direito de acesso ACCESS_SYSTEM_SECURITY a um objeto de processo se quiser ler ou gravar a SACL do objeto. Para obter mais informações, consulte ACLs (Listas de Controle de Acesso) e Direito de 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 Gerenciamento de Direitos Digitais. 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:
- DELETE
- 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 direito PROCESS_QUERY_LIMITED_INFORMATION foi introduzido para fornecer acesso a um subconjunto das informações disponíveis por meio de PROCESS_QUERY_INFORMATION.