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 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 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 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 ao 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, sem incluir as informações no SACL. Para ler ou gravar o SACL, você deve solicitar o direito de acesso ACCESS_SYSTEM_SECURITY. Para obter mais informações, consulte SACL Access Right.
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 do objeto.

 

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 Windows Vista. Se um aplicativo compilado para Windows Server 2008 e Windows Vista for executado no Windows Server 2003 ou Windows XP, o sinalizador de PROCESS_ALL_ACCESS será muito grande e a função especificando 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 Como usar os cabeçalhos de 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 CreateProcesstem 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 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

Windows Vista introduz processos protegidos para aprimorar o suporte à Rights Management Digital. 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 PROCESS_QUERY_LIMITED_INFORMATION direito foi introduzido para fornecer acesso a um subconjunto das informações disponíveis por meio de PROCESS_QUERY_INFORMATION.